32

In Linux, you can use xargs -d, to quickly run the hostname command against four different servers with sequential names as follows:

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

It looks like the OSX xargs command does not support the delimiter parameter. Can you achieve the same result with a differently formatted echo, or through some other command-line utility?

14

How about:

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

From man xargs:

-n number
Set the maximum number of arguments taken from standard input for each invocation of utility.
1
  • 1
    If the values can contain spaces, linefeeds, or tabs, you could use something like printf 'a\0a' | xargs -0 -n1 echo. – Lri Oct 18 '12 at 7:20
54

Alternatively, you can always install GNU xargs through Homebrew and the GNU findutils package.

Install Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Follow the instructions. Then install findutils:

brew install findutils

This will give you GNU xargs as gxargs, and you can use the syntax you're accustomed to from GNU/Linux. The same goes for other basic commands found in the findutils package such as gfind or glocate or gupdatedb, which have different BSD counterparts on OS X.

2
  • Thank you! I did this, then added the path to my .zshrc (as explained in the installation output) so I wouldn't have to use the g prefix. – absynce Aug 15 '19 at 18:25
  • ha yiss exactly what I was looking for – Jean-Bernard Jansen Apr 24 '20 at 13:24
3

You can also use tr in OSX to convert the commas to new lines and use xargs to enumerate through each item as follows:

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

If you want it run in parallel, use GNU Parallel:

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

with printf

$ printf '%s\n' 1 2 3 4 | xargs -I{} echo ssh root@www{}.example.com hostname
ssh root@www1.example.com hostname
ssh root@www2.example.com hostname
ssh root@www3.example.com hostname
ssh root@www4.example.com hostname

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.