【问题标题】:Using awk array to compare $NF使用 awk 数组比较 $NF
【发布时间】:2019-09-17 04:45:26
【问题描述】:

以下命令具有以下输出:

[xr-vm_node0_RP0_CPU0:~]$show_snmp_interface_notif -x .*
ifName : Null0                 ifIndex: 1
ifName : MgmtEth0/RP0/CPU0/0   ifIndex: 2
ifName : Loopback0             ifIndex: 5
ifName : Bundle-Ether25        ifIndex: 6
ifName : Bundle-Ether42        ifIndex: 7
ifName : Optics0/0/0/0         ifIndex: 8
ifName : Optics0/0/0/1         ifIndex: 9
...
ifName : HundredGigE0/0/1/3    ifIndex: 92
ifName : HundredGigE0/0/1/2    ifIndex: 93
ifName : HundredGigE0/0/1/1    ifIndex: 94
ifName : HundredGigE0/0/1/0    ifIndex: 95
ifName : Loopback1             ifIndex: 96

我想提取最后一列等于以下任何数字的行。

2  6  7  52  53  54  55  56  57  89  90  91

尝试: 1) 确认上述元素通过array[i] 正确存储和打印

[xr-vm_node0_RP0_CPU0:~]$show_snmp_interface_notif -x .* | awk 'BEGIN{split("2  6  7  52  53  54  55  56  57  89  90  91",array)}; END {for (i in array) print array[i]}'
2
6
7
52
53
54
55
56
57
89
90
91

2) 验证 $NF 匹配最后一列

[xr-vm_node0_RP0_CPU0:~]$show_snmp_interface_notif -x .* | awk '{print $NF}'
1
2
5
6
7
8
9
10
11
12
...
92
93
94
95
96

3) 编写了以下不打印任何内容的 awk 语句。我怀疑打印语句不正确。如果最后一列匹配 array[i] 中的任何指定元素,我们需要提取完整的行。

[xr-vm_node0_RP0_CPU0:~]$show_snmp_interface_notif -x .* | awk 'BEGIN{split("2  6  7  52  53  54  55  56  57  89  90  91",array)}; END {for (i in array); if(array[i]==$NF) { print $i }}'

[xr-vm_node0_RP0_CPU0:~]$show_snmp_interface_notif -x .* | awk 'BEGIN{split("2  6  7  52  53  54  55  56  57  89  90  91",array)}; END {for (i in array); if(array[i]==$NF) { print i }}'

【问题讨论】:

    标签: awk


    【解决方案1】:

    请您尝试关注一下。

    awk '
    BEGIN{
      num=split("2 6 7 52 53 54 55 56 57 89 90 91",array," ")
      for(i=1;i<=num;i++){
        b[array[i]]
      }
    }
    ($NF in b)
    '   Input_file
    

    your_command | awk '
    BEGIN{
      num=split("2 6 7 52 53 54 55 56 57 89 90 91",array," ")
      for(i=1;i<=num;i++){
        b[array[i]]
      }
    }
    ($NF in b)' 
    

    【讨论】:

    • @user 不需要测试。一次数组查找的时间
    【解决方案2】:

    这可以在没有数组的情况下完成。 (如果数据来自另一个源数组,我可以使用)。应该更快,因为不涉及循环。

    your commands | awk '$NF~/^(2|6|7|52|53|54|55|56|57|89|90|92)$/'
    ifName : MgmtEth0/RP0/CPU0/0   ifIndex: 2
    ifName : Bundle-Ether25        ifIndex: 6
    ifName : Bundle-Ether42        ifIndex: 7
    

    【讨论】:

    • @user 通常循环速度较慢,所以如果我能避免它,我会这样做,但取决于数据量,这可能会有所不同。无论如何,这不太复杂,更容易理解。
    【解决方案3】:

    删除一个 ;END 以在每一行标准输入中运行 for 循环。使用 ; 您的 for 循环没有主体。

    ... | awk 'BEGIN{split("2  6  7  52  53  54  55  56  57  89  90  91",array)}; {for (i in array) if(array[i]==$NF) { print }}'
    

    输出:

    ifName : MgmtEth0/RP0/CPU0/0 ifIndex: 2 ifName : Bundle-Ether25 ifIndex: 6 ifName : Bundle-Ether42 ifIndex: 7

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 2015-01-30
      • 2017-09-23
      • 1970-01-01
      • 2017-01-31
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多