Tente isto:
$ ( ifconfig eth2 2>/dev/null || ifconfig eth0 2>/dev/null ) | grep ...
Ele tem a mesma lógica, mas faz o ||
dentro dos parens, então ele somente passa a saída do comando bem-sucedido para grep
.
Eu tenho esta linha de comando, mas está dobrando o grep
e awk
ifconfig eth1 2> /dev/null | grep "inet " | awk '{gsub("addr:","",$2); print $2 }' ||
ifconfig eth0 2> /dev/null | grep "inet " | awk '{gsub("addr:","",$2); print $2 }''
Eu estou tentando encurtar isso fazendo algo como
echo $(ifconfig eth1 2> /dev/null || ifconfig eth0 2> /dev/null) &> grep "inet " |
awk '{gsub("addr:","",$2); print $2 }'
mas não retorna nada quando procuro obter o IP do servidor. Qual é a melhor maneira de dizer obter informações se por erro tentar isso e, em seguida, canalizá-lo para grep
Outra abordagem mais modular: não bash-specific
get_ifconfig () {
for iface do
ifconfig "$iface" 2>/dev/null && return
done
}
get_ifconfig eth1 eth2 eth3 | sed -n 's/.*inet addr:\([0-9.]\+\).*//p'
Como sobre essa abordagem
$ echo eth1 eth0 | xargs -n 1 ifconfig 2>/dev/null | awk '/inet/{gsub("addr:","",$2);print $2;exit}'
192.168.124.132
$
Se você deseja obter a primeira interface que possui um endereço IPv4, é possível executar ifconfig
apenas uma vez para exibir todas as interfaces e extrair a primeira entrada com um endereço IPv4. Você também pode otimizar a extração combinando o que você está fazendo com grep
e awk
.
ifconfig -a | awk '/^[^ ]/ {iface=$1}
iface ~ /^eth/ && sub(/inet addr:/,"") {print $1; exit}'
A nova linha é opcional, eu incluí-lo para maior clareza. Esta é uma versão mais elaborada de
ifconfig -a | awk 'sub(/inet addr:/,"") {print $1; exit}'
que pode imprimir algo como 127.0.0.1
(da interface de loopback) que você presumivelmente não deseja.
Se você preferir usar ip
, a análise é igualmente desajeitada.
ip addr | awk '/^[0-9]/ {iface=$2}
iface ~ /^eth/ && $1 == "inet" {sub(/\/.*/, "", $2); print $2}'