web-dev-qa-db-ja.com

orとpipeを使用してコマンドを最適化し、ifconfigの出力を解析します

このコマンドラインがありますが、grepawkが2倍になっています

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 }'`

私は次のようなことをしてこれを短縮しようとしています、

echo $(ifconfig eth1 2> /dev/null || ifconfig eth0 2> /dev/null) &>  grep "inet " |
awk '{gsub("addr:","",$2);  print $2 }'

しかし、サーバーのIPを取得しようとすると、何も返されません。エラーが発生した場合に情報を取得するための最良の方法は、これを試してからgrepにパイプすることです。

1
jeremy.bass

これを試して:

$ ( ifconfig eth2 2>/dev/null || ifconfig eth0 2>/dev/null ) | grep ...

同じロジックですが、||括弧内にあるため、成功したコマンドの出力のみがgrepに渡されます。

0
John

もう1つのよりモジュール化されたアプローチ:bash固有ではありません

get_ifconfig () { 
    for iface do 
        ifconfig "$iface" 2>/dev/null && return
    done
}
get_ifconfig eth1 eth2 eth3 | sed -n 's/.*inet addr:\([0-9.]\+\).*/\1/p'
2
glenn jackman

IPv4アドレスを持つ最初のインターフェースを取得する場合は、ifconfigを1回だけ実行してすべてのインターフェースを表示し、IPv4アドレスを持つ最初のエントリを抽出できます。 grepawkを組み合わせて、抽出を最適化することもできます。

ifconfig -a | awk '/^[^ ]/ {iface=$1}
                  iface ~ /^eth/ && sub(/inet addr:/,"") {print $1; exit}'

改行はオプションです。わかりやすくするために含めました。これはより精巧なバージョンです

ifconfig -a | awk 'sub(/inet addr:/,"") {print $1; exit}'

127.0.0.1(ループバックインターフェイスから)のような、おそらく不要なものを出力する可能性があります。

ipを使用したい場合、構文解析はほぼ同じように厄介です。

ip addr | awk '/^[0-9]/ {iface=$2}
               iface ~ /^eth/ && $1 == "inet" {sub(/\/.*/, "", $2); print $2}'

このアプローチはどうですか

$ echo eth1 eth0 | xargs -n 1 ifconfig 2>/dev/null | awk '/inet/{gsub("addr:","",$2);print $2;exit}'
192.168.124.132
$
0
steve