4

我在 Nagios bash 脚本中有以下行。它用于获取指定网卡的上下错误率:

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

今天之前我从未使用过 awk,所以我正在寻找自己的方式。

正如我所看到的,我们将值 $INTERFACE 作为接口传递给 awk 脚本,然后过滤开始的行interface:(例如 eth0:)。然后,我们使用冒号空间作为分隔符来分割行。然后,由于某种原因,在实际提取我们想要的值之前,我们将数组中的第三个条目分配给 $0。

在我看来,这些陈述是不必要的split($0, a, /: */)$0 = a[2]但我可能是错的!当我们随后引用 $3 和 $11 时,将 a[2] 分配给 $0 会改变什么吗?我试过没有前两个语句的脚本,输出是一样的,但也许我错过了一个极端情况......

提前致谢

富有的

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 回答