4

Nagiosbashスクリプトに次の行があります。これは、指定されたネットワークカードのアップエラー率とダウンエラー率を取得するために使用されています。

if=`awk -v interface="$INTERFACE" '$1 ~ "^" interface ":" { split($0, a, /: */); $0 = a[2]; print $3 " " $11 }' /proc/net/dev`

私は今日までawkを使ったことがないので、少し道を見つけています。

ご覧のとおり、値$ INTERFACEをインターフェイスとしてawkスクリプトに渡し、先頭の行をフィルタリングしますinterface:(例:eth0:)。次に、コロンスペースを区切り文字として使用して行を分割します。次に、何らかの理由で、実際に必要な値を抽出する前に、配列の3番目のエントリを$0に割り当てます。

声明は不必要であるように私にsplit($0, a, /: */)$0 = a[2]思えますが、私は間違っているかもしれません!$3と$11を参照すると、$0にa[2]を割り当てると何かが変わりますか?最初の2つのステートメントなしでスクリプトを試しましたが、出力は同じですが、見逃したコーナーケースがあるかもしれません...

前もって感謝します

リッチ

4

1 に答える 1

2

split()は不要です。これはあなたのawkステートメントと同じです

awk -v interface="eth0" '$1~interface{print $3,$11 }' /proc/net/dev

または、shell(bash / ksh)を使用することもできます

shopt -s extglob
var=$(< /proc/net/dev)
var="${var##*$interface:+( )}"  # remove everything until and including the interface
var="${var%%$'\n'*}"  #remove from first newline onwards
set -- $var  
echo "$3 ${11}"
于 2010-09-03T10:54:31.447 に答える