代码之家  ›  专栏  ›  技术社区  ›  Rich

AWK:这些声明是必需的吗?

  •  4
  • Rich  · 技术社区  · 15 年前

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

    今天之前我从没和awk一起工作过,所以我有点想办法了。

    在我看来,我们将值$INTERFACE作为INTERFACE传递到awk脚本中,然后筛选开头的行 interface: (例如eth0:)。然后,我们使用冒号空间作为分隔符来分割行。然后,出于某种原因,在实际提取所需的值之前,我们将数组中的第三个条目赋给$0。

    split($0, a, /: */) $0 = a[2] 是不必要的,但我可能错了!当我们引用$3和$11时,将[2]赋值为$0会有什么变化吗?我试过脚本没有前两个语句,输出是一样的,但也许有一个角落的情况我错过了。。。

    提前谢谢

    1 回复  |  直到 15 年前
        1
  •  2
  •   ghostdog74    15 年前

    不需要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}"
    
    推荐文章