Bash - 解析snmpwalk输出

时间:2016-03-25 05:35:10

标签: bash sed

我想知道我是否可以从SNMPWALK调用中获得解析结果的帮助。我知道这里有几个问题与几乎这个确切的问题有关。例如,我查看并尝试了这两个问题的建议解决方案:

  1. Parsing snmpwalk output
  2. Parse SNMP output in Bash
  3. 从这里开始是我试图解析的SNMPWALK命令和结果:

    SNMPWALK命令:

    snmpwalk -v1 -c public 192.168.2.51 -Ovq IF-MIB::ifDescr
    

    SNMPWALK结果:

    Software Loopback Interface 1.
    WAN Miniport (SSTP).
    WAN Miniport (L2TP).
    WAN Miniport (PPTP).
    WAN Miniport (PPPOE).
    WAN Miniport (IPv6).
    WAN Miniport (Network Monitor).
    WAN Miniport (IP).
    RAS Async Adapter.
    Atheros AR8152 PCI-E Fast Ethernet Controller.
    Realtek RTL8191SE Wireless LAN 802.11n PCI-E NIC.
    ...
    

    基本上我要做的是搜索"无线LAN 802.11(?)PCI-E Nic。&#34 ;;在哪里?表示值a-z,并删除NIC后的任何多余值。

    因此,基本上从上面的列表中可以返回的唯一值是删除了Realtek RTL8191SE Wireless LAN 802.11n PCI-E NIC.部分的Realtek RTL8191SE。我还希望解决方案不返回NIC.之后具有值的项目。例如,如果给出这样的东西:

    Realtek RTL8191SE Wireless LAN 802.11n PCI-E NIC - Deterministic Network Enhancer Miniport-VirtualBox NDIS Light-Weight Filter-0000.
    

    解决方案应根据最后的附加值拒绝它。

    以下是我的代码目前的样子:

            #!/bin/bash
            ...
            IFS=$'\n'
            var=($(snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr))
            for i in "${var[@]}"; do
                    p=$(echo "$i" | sed 's/^.*\(Wireless LAN 802.11n PCI-E NCI.*\)/\1/')
    
            #       if [[ "$p" == "Wireless LAN 802.11n PCI-E NCI." ]]; then
                            echo "$p"
            #       fi
            done
           ...
    

    通过将SNMPWALK命令输出设置为数组,我已经意识到每个项目都以空格分隔值的形式添加。因此,我首先将IFS设置为换行符分隔符。然后我尝试根据我上面所说的来匹配每一行。

2 个答案:

答案 0 :(得分:2)

如果我理解这个问题,应该这样做:

snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr | \
sed -n 's/.*\(Wireless LAN 802.11[a-z] PCI-E NIC\)$/\1/p'

答案 1 :(得分:1)

问题中的代码无法正常工作。

  1. 您的(评论)测试与输入数据或您提供的示例的描述不符。
  2. 您还没有包含您的预期输出,但根据您的描述,我将假设它是802.11n PCI-E NIC
  3. 首先,如果您想要的是snmpwalk的输出,则以下内容可能就足够了:

    snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr \
    | grep -o 'Wireless LAN 802\.11. PCI-E NIC'
    

    这使用grep的-o选项仅返回包含匹配项的行的部分。

    或者,如果您只想要该字符串的一部分,则可以使用:

    snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr \
    | grep 'Wireless LAN 802\.11. PCI-E NIC' \
    | grep -o '802\.11.*NIC'
    

    第一个grep从snmpwalk的输出中删除了“有趣”的一行。如果字符串NIC在该行上出现两次的风险,您当然可以轻松调整此正则表达式。请注意,此解决方案几乎与shell无关;它不需要bash,它甚至可以在tcsh中工作。

    当然,在sed中这样做也很容易:

    #!/usr/bin/env bash
    
    sed -ne 's/.*\(Wireless LAN 802\.11. PCI-E NIC\).*/\1/p' \
      < <(snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr)
    

    如果你真的想在带有数组的bash中这样做,你可能会构造这样的东西:

    #!/usr/bin/env bash
    
    IFS=$'\n' readarray -t snmpwalk_out < <(snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr)
    
    for line in "${snmpwalk_out[@]}"; do
      if [[ "$line" = *"Wireless LAN 802.11"?" PCI-E NIC"* ]]; then
        line="$(sed 's/.*\(Wireless LAN 802\.11\)/\1/;s/NIC.*/NIC/' <<<"$line")"
        #line="Wireless LAN 802.11${line##*Wireless LAN 802.11}"; line="${line%%NIC.*}NIC"
      fi
    done
    

    请注意,readarray需要bash版本4。

    在这个脚本中的两个嵌套赋值行中,第一个使用sed剥离无关字符,第二个使用bash“Parameter Expansion”工具剥离它们。 (您可以在bash手册页中查看它们的工作方式。)