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
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.
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
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]}'
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/
.
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.
Tags shell-script