El sed
comando, el awk
comando y la eliminación del período final se pueden combinar en un solo comando awk:
while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
O, como se extiende sobre varias líneas:
while read -r host
do
dig +search "$host" ALL
done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
Debido a que el awk
comando sigue la done
declaración, solo awk
se invoca un proceso. Aunque la eficiencia puede no importar aquí, esto es más eficiente que crear un nuevo proceso sed o awk con cada ciclo.
Ejemplo
Con este archivo de prueba:
$ cat hostlist.txt
www.google.com
fd-fp3.wg1.b.yahoo.com
El comando produce:
$ while read -r host; do dig +search "$host" ALL; done <hostlist.txt | awk 'f{sub(/.$/,"",$1); print $1", "$NF; f=0} /ANSWER SECTION/{f=1}'
www.google.com, 216.58.193.196
fd-fp3.wg1.b.yahoo.com, 206.190.36.45
Cómo funciona
awk lee implícitamente su entrada un registro (línea) a la vez. Este script awk usa una sola variable, f
que indica si la línea anterior era un encabezado de sección de respuesta o no.
f{sub(/.$/,"",$1); print $1", "$NF; f=0}
Si la línea anterior era un encabezado de sección de respuesta, f
será verdadera y se ejecutarán los comandos entre llaves. El primero elimina el período final del primer campo. El segundo imprime el primer campo, seguido de ,
, seguido del último campo. La tercera declaración se restablece f
a cero (falso).
En otras palabras, f
aquí funciona como una condición lógica. Los comandos entre llaves se ejecutan si f
no es cero (que, en awk, significa 'verdadero').
/ANSWER SECTION/{f=1}
Si la línea actual contiene la cadena ANSWER SECTION
, entonces la variable f
se establece en 1
(verdadero).
Aquí, /ANSWER SECTION/
sirve como una condición lógica. Se evalúa como verdadero si la corriente coincide con la expresión regular ANSWER SECTION
. Si lo hace, entonces el comando entre llaves se ejecuta.
dig +short
que no funciona para ti?