首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash -分析snmpwalk输出

Bash -分析snmpwalk输出
EN

Stack Overflow用户
提问于 2016-03-25 05:35:09
回答 2查看 2.2K关注 0票数 0

我想知道我是否能得到一些帮助来解析SNMPWALK调用的结果。我知道这里有几个问题和这个问题有关。例如,我查看并尝试了从这两个问题中提出的解决方案:

  1. Parsing snmpwalk output
  2. Parse SNMP output in Bash

首先,我尝试解析SNMPWALK命令和结果:

SNMPWALK命令:

代码语言:javascript
复制
snmpwalk -v1 -c public 192.168.2.51 -Ovq IF-MIB::ifDescr

SNMPWALK结果:

代码语言:javascript
复制
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.
...

基本上我要做的是搜索“无线局域网802.11(?) PCI”;在哪里?表示a-z值,并在NIC之后去掉任何多余值。

因此,从上面的列表中,返回的唯一值就是删除了Realtek RTL8191SE Wireless LAN 802.11n PCI-E NIC.部分的Realtek RTL8191SE部分。我还希望解决方案不返回在NIC.之后有值的项。例如,如果给出如下内容:

代码语言:javascript
复制
Realtek RTL8191SE Wireless LAN 802.11n PCI-E NIC - Deterministic Network Enhancer Miniport-VirtualBox NDIS Light-Weight Filter-0000.

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

下面是我的代码当前的样子:

代码语言:javascript
复制
        #!/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设置为换行符。然后我试着根据我上面说的来匹配每一行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-28 03:57:51

如果我明白这个问题,就应该这样做:

代码语言:javascript
复制
snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr | \
sed -n 's/.*\(Wireless LAN 802.11[a-z] PCI-E NIC\)$/\1/p'
票数 2
EN

Stack Overflow用户

发布于 2016-03-28 03:53:20

你问题中的代码不能按原样工作。

  1. 您的(注释)测试与输入数据的描述或所提供的示例不匹配。
  2. 您还没有包含预期的输出,但根据您的描述,我将假设它是802.11n PCI-E NIC

首先,如果您想要的只是来自snmpwalk的输出,那么以下可能就足够了:

代码语言:javascript
复制
snmpwalk -v1 -c public -Ovq $1 IF-MIB::ifDescr \
| grep -o 'Wireless LAN 802\.11. PCI-E NIC'

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

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

代码语言:javascript
复制
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中这样做也很容易:

代码语言:javascript
复制
#!/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中这样做,您可以构造如下所示的内容:

代码语言:javascript
复制
#!/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“参数展开”工具剥离它们。(您可以在bash手册页面中查找它们的工作方式。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36214601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档