
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 for
construcción y usando head
para cada uno ping
. Usar xargs
con la -P
opción tampoco funciona. Supongo que el problema principal sería que la salida head
se alimenta xargs
como 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 whois
y canalizando su salida sed
y luego tal vez hacer algunas agrupaciones para tener solo nombres únicos, sin repeticiones. Estoy de acuerdo con eso dig
o host
son mucho más completos, ping
pero 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 head
y no grep
para 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 1
sale 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, xargs
hace 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 pipefail
en tu script, el código de salida del script completo es cero: el código de salida del sed
comando.
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