AWK:这些陈述是否必要?

时间:2010-09-03 08:49:25

标签: bash awk nagios

我在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美元时,将[2]分配给$ 0会改变什么吗?我已经尝试了没有前两个语句的脚本,输出是相同的,但也许有一个我错过的角落案例......

提前致谢

1 个答案:

答案 0 :(得分: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}"