imprime o endereço IP com o nome da interface

1

Eu quero mostrar o endereço IP como abaixo

lo : 127.0.0.1 
eth0 : 192.168.5.123
eth1 : 192.172.0.212
wlan0 : 10.1.0.124

Consigo imprimir todos os endereços IP em ifconfig | awk '/inet addr/{print substr($2,6)}' . Mas é só imprimir os IPs. Cada sistema tem seus próprios nomes e endereços de interface. Então, meu script precisa mostrar suas interfaces com relação aos endereços IP.

    
por gangadhars 02.02.2015 / 07:40

4 respostas

7

O seguinte fará o que você deseja:

$ ip addr | awk '
/^[0-9]+:/ { 
  sub(/:/,"",$2); iface=$2 } 
/^[[:space:]]*inet / { 
  split($2, a, "/")
  print iface" : "a[1] 
}'
lo : 127.0.0.1
br0 : 10.1.10.12
    
por 02.02.2015 / 07:58
3
ip -o addr | awk '{split($4, a, "/"); print $2" : "a[1]}'

Ou se você não estiver interessado nos endereços locais:

ip -o addr show scope global | awk '{split($4, a, "/"); print $2" : "a[1]}'
    
por 26.11.2017 / 17:32
1

Isso funciona para mim:

for IF in $(ip link show | awk -F: '$1>0 {print $2}')
do
  echo -n "$IF : "
  ip addr show dev "$IF" | awk '$1=="inet"{print gensub("/.*","","",$2)}' | xargs
done

Você pode executar tudo em uma linha, se preferir, mas achei que seria um pouco mais fácil entender como um loop.

O ip link show fornece a lista de interfaces. O ip addr show dev "$IF" fornece a lista de endereços IP associados à interface nomeada. O awk retira o endereço IP de cada linha que começa com inet .

Ele não corresponde a inet6 e, portanto, não fornecerá endereços IPv6. No entanto, se você quiser incluí-los, poderá alterar a construção $1=="inet" para $1~/^inet/ .

    
por 02.02.2015 / 15:33
0

Digitando isto abaixo, listará todas as interfaces que possuem ips -

ip r show|grep " src "|cut -d " " -f 3,12

Saída:

tun0 10.0.0.1
eth0 10.0.0.2
enp1 10.0.0.3

em mente - ele não selecionará interfaces que não tenham ips atribuídas a elas.

    
por 13.12.2018 / 13:13