O sedcomando, oawk comando e a remoção do período final podem ser combinados em um único 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}'
Ou, como distribuídos por várias linhas:
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}'
Porque o awk comando segue a doneinstrução, apenas um awkprocesso é chamado. Embora a eficiência possa não ter importância aqui, isso é mais eficiente do que criar um novo processo sed ou awk a cada loop.
Exemplo
Com este arquivo de teste:
$ cat hostlist.txt
www.google.com
fd-fp3.wg1.b.yahoo.com
O comando produz:
$ 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
Como funciona
O awk lê implicitamente sua entrada, um registro (linha) de cada vez. Esse script do awk usa uma única variável, fque indica se a linha anterior era ou não um cabeçalho da seção de resposta.
f{sub(/.$/,"",$1); print $1", "$NF; f=0}
Se a linha anterior era um cabeçalho da seção de resposta, fserá verdadeira e os comandos entre chaves são executados. O primeiro remove o período à direita do primeiro campo. O segundo imprime o primeiro campo, seguido por ,, seguido pelo último campo. A terceira instrução é redefinida fpara zero (false).
Em outras palavras, faqui funciona como uma condição lógica. Os comandos entre chaves são executados se ffor diferente de zero (o que, no awk, significa 'true').
/ANSWER SECTION/{f=1}
Se a linha atual contiver a sequência ANSWER SECTION, a variável fserá configurada como 1(true).
Aqui, /ANSWER SECTION/serve como uma condição lógica. É avaliado como verdadeiro se a corrente corresponder à expressão regular ANSWER SECTION. Se isso acontecer, o comando entre chaves será executado.
dig +shortnão funciona para você?