O sed
comando, 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 done
instrução, apenas um awk
processo é 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, f
que 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, f
será 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 f
para zero (false).
Em outras palavras, f
aqui funciona como uma condição lógica. Os comandos entre chaves são executados se f
for 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 f
será 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 +short
não funciona para você?