¿Cómo hacer que xargs haga ping y produzca la cabeza como se esperaba?

¿Cómo hacer que xargs haga ping y produzca la cabeza como se esperaba?

Dada una serie de dominios, me gustaría obtener sus direcciones IP, en el siguiente formato:

98.139.183.24
98.137.236.24

este guión

#!/bin/bash
domains=(yahoo.com yahoo.ca)
printf "%s\0" "${domains[@]}" | xargs -0 -t -n 1  ping -c 1 -w 3 | grep -E 'PING.*' | sed -r 's:^.*\((([0-9]{1,3}\.){3}[0-9]{1,3})\).*$:\1:'

da el resultado esperado. Pero inicialmente lo intenté: printf "%s\0" "${domains[@]}" | xargs -0 -t -n 1 ping -c 1 -w 3 | head -n 1 | sed -r 's:^.*\((([0-9]{1,3}\.){3}[0-9]{1,3})\).*$:\1:'y el comando salió con una señal 13 (que, según tengo entendido, significa tubería rota?!?). Obviamente el problema es con head. Ahora me gustaría explorar por qué no funciona y, eventualmente, cómo podría hacer que esta larga “salchicha” funcione con head. No lo he probado todavía, pero estoy bastante seguro de que funcionaría usando una forconstrucción y usando headpara cada uno ping. Usar xargscon la -Popción tampoco funciona. Supongo que el problema principal sería que la salida headse alimenta xargscomo un archivo continuo (¿dije bien o es "entrada"?).

EDITAR 1: Mi objetivo era obtener las direcciones IP de un conjunto de direcciones de sitios web y luego verificar en qué organizaciones están registradas esas IP también usando whoisy canalizando su salida sedy luego tal vez hacer algunas agrupaciones para tener solo nombres únicos, sin repeticiones. Estoy de acuerdo con eso digo hostson mucho más completos, pingpero estoy bastante seguro de que los sitios web son lo suficientemente pequeños como para que solo se encuentre una dirección IP para cada dominio. Sin embargo, creo que ahora seguiré dig(o host; aún no lo he decidido) como sugirieron otros.

Para dejar en claro por qué estoy interesado en usarlo heady no greppara lo que necesito: solo tengo curiosidad por saber cómo se haría (soy bastante nuevo en bash y Linux en general) y sentí que podría aclarar cómo funciona la tubería. Eso es todo

Respuesta1

head -n 1sale después de que se haya impreso la primera línea y envía SIGPIPE al escritor ( xargs) para decirle que no queda ningún proceso para leer lo que escribe. En respuesta, xargshace lo que hacen la mayoría de los procesos y elimina sus subprocesos ( ping), imprime una advertencia, probablemente envía SIGPIPE a su propio padre y luego se elimina a sí mismo.

Sin embargo, notarás que, dado que no has configurado pipefailen tu script, el código de salida del script completo es cero: el código de salida del sedcomando.

Respuesta2

echo 192.168.1.1 192.168.1.2 192.168.1.3|xargs -n1 ping -w 1

o con grep, vea solo los nodos que no son ping

echo 192.168.1.1 192.168.1.2 192.168.1.3|xargs -n1 ping -w 1|grep -b1 100

información relacionada