我在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会改变什么吗?我已经尝试了没有前两个语句的脚本,输出是相同的,但也许有一个我错过的角落案例......
提前致谢
富
答案 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}"