Imprimindo interface-ipaddress através de um único comando (canalizado)

0

ifconfig fornece a seguinte saída:

   eth0      Link encap:Ethernet  HWaddr 4c:87:0e:z3:e7:11  
              UP BROADCAST MULTICAST  MTU:1500  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

    lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:35767 errors:0 dropped:0 overruns:0 frame:0
          TX packets:35767 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:5053027 (5.0 MB)  TX bytes:5053027 (5.0 MB)

vmnet1    Link encap:Ethernet  HWaddr 60:80:66:m0:00:01  
          inet addr:192.168.139.1  Bcast:192.168.139.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fec0:1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:70 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Eu atualmente preciso de saída como

eth0   
wlan0   127.0.0.1
vmnet1  192.168.139.1

para que eu execute o comando

ifconfig | awk '/encap|inet addr/{  print }'

mas estou preso agora, pois preciso combinar duas linhas com base no clima, a próxima linha contém o padrão ipaddress. Embora o script de shell possa fazer o truque, Mas eu preciso de uma solução simples de comando. Embora os loops estejam no awk, mas olhando para a próxima linha, combinando & então imprimir no console é um desafio para mim.

ou existe um comando / sinalização simples para alcançar tal objetivo?

O comando route parece fazer o truque (extração do campo awk !!), mas ele não lista as interfaces inativas.

    
por Puneet S. Chauhan 09.02.2015 / 09:42

4 respostas

1

finalmente encontrou a solução baseada em ifconfig!

String s="ifconfig | awk -F '[ :]' '/encap|inet addr/{ if($1 != \"\" ){ print $1 \":\" $13 } else print $13 }'| awk -F \":\" '{print $1}'| awk '{  curr=$1 ; if(!system(\"echo \"$1\"|grep ^[0-9]>/dev/null\")) {print prev \"\t : \" curr;prev=\"\"} else { if(prev!=\"\") {print prev \"\t : not assigned\" }; prev=$1 }   }'"

explicação:

root$ ifconfig | awk -F '[ :]' '/encap|inet addr/{ if($1 != "" ){ print $1 ":" $13 } else print $13 }'| awk -F ":" '{print $1}'
eth0
lo
127.0.0.1
vmnet1
192.168.139.1
vmnet8
192.168.152.1
wlan0
10.208.7.86

Então, eu canalizei a saída acima para outro comando awk:

| awk '{  curr=$1 ; if(!system("echo "$1"|grep ^[0-9]>/dev/null")) {print prev "\t : " curr;prev=""} else { if(prev!="") {print prev "\t : not assigned" }; prev=$1 }   }'

aqui, se eu encontrar dois nomes de interface consecutivos, então eu imprimo o nome da interface anterior com o comando customizado não atribuído ".se eu obtenho um padrão numérico string then current string (ipaddress) junto com o prev nome da interface ious é impresso!

    
por 09.02.2015 / 13:27
3

Se você estiver executando o GNU / Linux:

for DEV in /sys/class/net/*; do
    printf "%-10s %s\n" ${DEV##*/} $(ip addr show ${DEV##*/} | \
      sed -rne '/inet/s:\s+inet\s+([0-9.]+).*::gp');
done

ou se ifconfig for um requisito:

for DEV in /sys/class/net/*; do
    printf "%-10s %s\n" ${DEV##*/} $(ifconfig ${DEV##*/} | \
      sed -rne '/inet adr/s/\s+inet adr:([0-9.]+).*//gp');
done

rende

eth0       192.168.10.34
eth1       
lo         127.0.0.1
...

Requer iproute2 embora.

    
por 09.02.2015 / 10:24
0

ifconfig -a | awk '/ Link / {n = $ 1} / addr / {print n, substr ($ 2, índice ($ 2, ":") + 1))}'

Simplesmente, pegue o nome e, em seguida, quando o endereço aparecer, imprima o nome e o endereço, que segue os dois pontos.

    
por 09.02.2015 / 13:49
0

Outra possibilidade com apenas ifconfig e awk . Deve funcionar também para interfaces com alias (eth0: 1) e interfaces vlan (eth0.1):

ifconfig | awk 'BEGIN {RS="\n\n"; } { if ($7 != "addr:") {print $1,$7} }'
O parâmetro

RS no awk é o separador de registro e nós o definimos como 2 novas linhas. Isso faz com que o awk mescle todas as informações sobre cada interface em uma única linha. Eu também suprimo as interfaces de impressão que não têm nenhum endereço IPv4 configurado.

Eu uso este comando para mostrar para cada interface seu IP e também seu nome de host resolvido:

ifconfig | awk 'BEGIN {RS="\n\n"; } { if ($7 != "addr:") {print $1,$7} }' | sed 's/addr://g' | while read iface ip; do
  echo $iface $ip $(getent hosts | awk '/^'$ip'/ {print $2}');
done

A saída é semelhante a:

bond0 10.126.226.102 deh137.abc.biz.
bond0:1 10.126.227.10 aeudi64.abc.biz.
bond0:7 10.126.226.141 rtlci22.abc.biz.
bond1.625 10.126.216.142
bond1.654 10.126.228.102 deh137s.abc.biz.

EDITAR: Atualizado o último comando para trabalhar com DNS e com a resolução baseada em / etc / hosts.

    
por 07.06.2016 / 16:40

Tags