¿Por qué xargs no ejecuta un comando por línea para este caso de uso?

0

Mi tarea general es hacer ping a cada servidor EC2 al que estoy conectado.

Estoy usando este comando para hacer eso:

netstat -W | grep ec2 | cut -d " " -f 18 | sort -u | cut -d "." -f 1,2,3,4 | xargs -0 -p "ping -c 10"

Produce la salida correcta, pero no llama xargspor línea:

ping -c 10 ec2-107-20-154-211.compute-1.amazonaws.com
ec2-107-20-169-186.compute-1.amazonaws.com
ec2-13-58-191-91.us-east-2.compute.amazonaws
ec2-18-204-248-223.compute-1.amazonaws.com
ec2-18-207-50-150.compute-1.amazonaws.com
ec2-18-234-32-173.compute-1.amazonaws.com
ec2-34-192-54-86.compute-1.amazonaws.com
ec2-34-195-196-96.compute-1.amazonaws.com
ec2-34-206-216-146.compute-1.amazonaws.com
?...^C

La explicación escrita de cada paso es:

  1. Ejecute netstat con el -Windicador para obtener FQDN completos y no nombres de host cortos
  2. grep para ec2
  3. cut la salida para obtener solo la columna de nombre de host
  4. sort nombres de host únicos
  5. cutel nombre de host nuevamente para eliminar el número de puerto desde el final, por ejemplo, ec2-1-2-3.amazon.com.80->ec2-1-2-3.amazon.com
  6. xargsla salida a pingcada host diez veces

Creo que me encuentro con un problema con cualquiera de las variantes de OS X xargsporque la canalización de la misma salida wc -lmuestra ocho líneas:

netstat -W | grep ec2 | cut -d " " -f 18 | sort -u | cut -d "." -f 1,2,3,4 | wc -l
       8

Me estoy centrando en el aspecto xargs aquí. Esa es la única parte de esta tarea que aparentemente no funciona.

Freiheit
fuente

Respuestas:

1

Lo resolví yo mismo con:

netstat -W | grep ec2 | cut -d " " -f 18 | sort -u | cut -d "." -f 1,2,3,4 | xargs -p -L 1 ping -c 10

Proporciona las ocho llamadas esperadas ping, una para cada host encontrado.

Creo que esta solución funciona porque la -Lbandera lo limita a una línea por comando.

Freiheit
fuente