Alguém pode explicar o que este comando grep / cut / awk está fazendo

0

Isso está dentro de um arquivo de script .sh:

cd /somefolder  
IP=$(ifconfig | grep 'inet addr:'| grep 168 | grep 192|cut -d: -f2 | awk '{print $1}')

A pasta / some tem outra lista de pastas com um único arquivo de texto.

Alguém pode explicar o que o comando acima está fazendo, ele está combinando bash, com grep e awk.

Além disso, para depurar isso e entendê-lo melhor, é possível que eu execute isso na linha de comando também?

    
por Blankman 16.06.2014 / 20:12

1 resposta

4

ifconfig deixa você com um bloco de texto como este:

eth0      Link encap:Ethernet  HWaddr aa:aa:aa:aa:aa:aa  
          inet addr:192.168.0.4  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::6ef0:49ff:fe54:b80/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:118583044 errors:0 dropped:0 overruns:0 frame:0
          TX packets:117593447 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:86729976752 (86.7 GB)  TX bytes:96008613785 (96.0 GB)

Os primeiros grep filtros para linhas que contêm inet addr: , deixando você com:

          inet addr:192.168.0.4  Bcast:192.168.0.255  Mask:255.255.255.0

Os próximos dois comandos grep filtram novamente, procurando por 192 e 168 . Eu acho que ele está procurando por IPs locais. Aqueles que tendem a se parecer com 192.168.*.* . Nem todos os IPs locais são assim, mas vou ignorar isso por enquanto.

No caso do nosso exemplo, nada é filtrado.

O corte usa : como um delimitador (ponto de corte) e assume o segundo valor:

192.168.0.4  Bcast

awk delimita por espaço por padrão e imprime a primeira coluna, deixando-nos com:

192.168.0.4

É um script que tenta obter o seu IP local. Não é muito bom. Se a sua LAN usa um formato de endereçamento diferente ou se você tem um IP legal (externo) com 192 ou 168 nele ou sua máscara - como 4.4.168.192 - isso incorretamente o pegaria.

Provavelmente existem maneiras melhores de obter seu IP interno do que filtrar ifconfig output, mas aqui está outro método de filtragem que usa apenas um awk para limpar:

ifconfig | awk -F' |:' '/inet addr:192\.168\./ {print $13}'

Ele funcionará apenas para 192.168. . endereços, mas isso já é melhor que o comando existente.

    
por Oli 16.06.2014 / 20:17