45

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?

5 Answers5

72

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.

slhck
  • 235,242
24

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.
slhck
  • 235,242
4

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
John
  • 191
2

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

parallel ssh root@www{}.example.com hostname ::: {1..4}
Ole Tange
  • 5,099
1

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