optimize o comando com ou e pipe para analisar a saída do ifconfig

1

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

    
por jeremy.bass 06.07.2015 / 20:50

4 respostas

0

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 .

    
por 06.07.2015 / 20:56
2

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'
    
por 06.07.2015 / 21:22
0

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
$
    
por 06.07.2015 / 21:15
0

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}'
    
por 07.07.2015 / 01:06