recebendo um monte de s (incompletos) durante um comando GREP e AWK

1

quando eu uso este comando:

arp -a | grep "192.168.0.19" | awk '{ print $4 }'

Eu recebo estes resultados ... o ff: ff endereço MAC é o que eu quero, mas por que eu recebo um campo de (incompleto) s? Tudo que eu quero é apenas o endereço MAC do IP específico do qual estou me aproximando.

ff:ff:ff:ff:ff:ff
(incomplete)
(incomplete)
(incomplete)
(incomplete)
(incomplete)
(incomplete)
(incomplete)
(incomplete)
(incomplete)
(incomplete)
    
por James Dean 12.08.2016 / 23:39

1 resposta

2

Aparentemente, você tentou recentemente acessar 192.168.0.190 , 192.168.0.191 ,… 192.168.0.199 (observe que há 10 (incomplete) s). Esses endereços não puderam ser alcançados, mas o cache do kernel ainda mantém suas entradas incompletas por um tempo.

Eu acho que se você tivesse arp -a | grep "192.168.0.19" você poderia descobrir isso sozinho.

Meu arp -a (no Ubuntu 14.04.5 LTS) coloca os endereços IP entre parênteses. Experimente:

arp -a | grep "(192.168.0.19)" | awk '{ print $4 }'

Ou você pode filtrar a opção (incomplete) s com -v de grep :

arp -a | grep "192.168.0.19" | grep -v "(incomplete)" | awk '{ print $4 }'

Oops! A última versão pode retornar endereços MAC de hosts que você não espera. Pense no que acontecerá se 192.168.0.19 tiver entrada incompleta e, por exemplo, 192.168.0.190 tem um completo. Deixo aqui para fins educacionais.

Ainda, grep -v pode ser útil (observe que os parênteses próximos ao endereço IP estão de volta):

arp -a | grep "(192.168.0.19)" | grep -v "(incomplete)" | awk '{ print $4 }'

Dessa forma, você obtém o endereço MAC desejado ou nada, se não houver uma entrada completa para este IP.

Finalmente, meu arp pode retornar informações sobre somente IPs específicos: arp -a 192.168.0.19 . Esta é a melhor maneira de começar. O comando inteiro pode ser assim:

arp -a 192.168.0.19 | grep -v "(incomplete)" | awk '{ print $4 }'

Opa novamente! Armadilhas por toda parte. Este último comando não retornará nenhuma saída se o nome do host de 192.168.0.19 for igual a foobar-(incomplete) . Versão melhorada:

arp -a 192.168.0.19 | awk '{ print $4 }' | grep -v "(incomplete)"
    
por 12.08.2016 / 23:51