2010-09-03 124 views
4

我在Nagios bash脚本中有以下行。它被用于获取上下误差率指定网卡:AWK:这些声明是否需要?

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的分配是否会改变任何东西?我已经试过了脚本,而不将前两个语句和输出是一样的,但也许有一个角落情况下,我已经错过了......

在此先感谢

丰富

回答

2

分割( )是不必要的。这是与您的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}" 
相关问题