Remplacement pour xargs -d dans osx


22

Sous Linux, vous pouvez utiliser xargs -d,pour exécuter rapidement la hostnamecommande sur quatre serveurs différents avec des noms séquentiels comme suit:

echo -n 1,2,3,4 |xargs -d, -I{} ssh root@www{}.example.com hostname

Il semble que la commande OSX xargs ne prend pas en charge le paramètre délimiteur. Pouvez-vous obtenir le même résultat avec un format différent echoou via un autre utilitaire de ligne de commande?

Réponses:


11

Que diriez-vous:

echo {1..4} | xargs -n1 -I{} ssh root@www{}.example.com hostname

De man xargs:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility.

1
Si les valeurs peuvent contenir des espaces, des sauts de ligne ou des tabulations, vous pouvez utiliser quelque chose comme printf 'a\0a' | xargs -0 -n1 echo.
Lri

45

Alternativement, vous pouvez toujours installer GNU xargsvia Homebrew et le findutilspaquet GNU .

Installez Homebrew:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Suivez les instructions. Installez ensuite findutils:

brew install findutils

Cela vous donnera GNU xargsas gxargset vous pourrez utiliser la syntaxe à laquelle vous êtes habitué depuis GNU / Linux. Il en va de même pour les autres commandes de base trouvées dans le package findutils telles que gfindou glocateou gupdatedb, qui ont des homologues BSD différents sur OS X.


Je vous remercie! J'ai fait cela, puis j'ai ajouté le chemin d'accès à mon .zshrc(comme expliqué dans la sortie de l'installation) pour ne pas avoir à utiliser le gpréfixe.
absynce

2

Si vous voulez qu'il fonctionne en parallèle, utilisez GNU Parallel:

parallel ssh root@www{}.example.com hostname ::: {1..4}

1

Vous pouvez également utiliser trdans OSX pour convertir les virgules en nouvelles lignes et utiliser des xargs pour énumérer chaque élément comme suit:

echo -n 1,2,3,4 | tr -s ',' '\n' | xargs -I{} ssh root@www{}.example.com hostname
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.