Use a opção "-o" de ip
:
ip -o addr | sed -e 's/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/: ""/;t;s/^[0-9]*: \([^ :]*\).*/: ""/g' | sort -r | sort -u -t: -k1,1
O resultado deve estar no seu caso:
br-priv: ""
eth0: "192.168.1.123/24"
lo: "127.0.0.1/8"
wlan0: "10.42.0.10/24"
O comando imprime apenas um IPv4 por dispositivo de rede (é possível configurar vários endereços IP na mesma interface).
Explicações:
A expressão sed
s/^[0-9]: \([^ ]*\).*inet \([^ \t]*\).*/: ""/;
substitui 1: lo inet 127.0.0.1/8 brd 255 [...]
por lo: "127.0.0.1/8"
t;
pula para o final se isso puder ser feito (= um endereço IPv4 foi encontrado), caso contrário:
s/^[0-9]*: \([^ :]*\).*/: ""/
substituir linhas sem endereços IPv4, por exemplo 1: lo inet6 ::1/128 [...]
com lo: ""
.
Todas as linhas são impressas automaticamente (sem -n
flag).
O comando sort -r
classifica agora a linha reversa. As linhas com endereços IPv4 (por exemplo, lo: "127.0.0.1/8"
) são, em todos os casos, antes das linhas sem ( lo: ""
).
O comando sort -u -t: -k1,1
aplica classificação única ao primeiro campo (os nomes da interface, o separador é definido como :
). Em nosso exemplo, apenas a linha " lo: "127.0.0.1/8"
" sobrevive como ocorre primeiro (devido à classificação anterior).