El sedcomando, el awkcomando 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 awkcomando sigue la donedeclaración, solo awkse 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, fque 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, fserá 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 fa cero (falso).
En otras palabras, faquí funciona como una condición lógica. Los comandos entre llaves se ejecutan si fno es cero (que, en awk, significa 'verdadero').
/ANSWER SECTION/{f=1}
Si la línea actual contiene la cadena ANSWER SECTION, entonces la variable fse 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 +shortque no funciona para ti?