Sostituzione per xargs -d in osx


22

In Linux, è possibile utilizzare xargs -d,per eseguire rapidamente il hostnamecomando su quattro server diversi con nomi sequenziali come segue:

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

Sembra che il comando OSX xargs non supporti il ​​parametro delimitatore. Riesci a ottenere lo stesso risultato con una formattazione diversa echoo tramite un'altra utilità della riga di comando?

Risposte:


11

Che ne dite di:

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

Da man xargs:

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

1
Se i valori possono contenere spazi, avanzamenti di riga o schede, è possibile utilizzare qualcosa di simile printf 'a\0a' | xargs -0 -n1 echo.
Lri,

44

In alternativa, puoi sempre installare GNU xargstramite Homebrew e il findutilspacchetto GNU .

Installa Homebrew:

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

Seguire le istruzioni. Quindi installare findutils:

brew install findutils

Questo ti darà GNU xargscome gxargs, e puoi usare la sintassi a cui sei abituato da GNU / Linux. Lo stesso vale per altri comandi di base presenti nel pacchetto findutils come gfindo glocateo gupdatedb, che hanno diverse controparti BSD su OS X.


Grazie! L'ho fatto, quindi ho aggiunto il percorso al mio .zshrc(come spiegato nell'output dell'installazione), quindi non avrei dovuto usare il gprefisso.
absynce il

2

Se vuoi che funzioni in parallelo, usa GNU Parallel:

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

1

Puoi anche usare trOSX per convertire le virgole in nuove righe e usare xargs per enumerare ogni elemento come segue:

echo -n 1,2,3,4 | tr -s ',' '\n' | xargs -I{} ssh root@www{}.example.com hostname
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.