【问题标题】:Parsing snmpwalk output解析 snmpwalk 输出
【发布时间】:2015-02-02 17:54:01
【问题描述】:

我知道这里有很多关于解析 snmpwalk 响应的问题和答案,但我似乎无法在这里找到相关的答案。我不擅长解析文本,但我正在尽力学习。

我正在使用以下命令轮询我的瞻博网络设备:

snmpwalk -v2c -c blablabla x.x.x.x iso.3.6.1.2.1.2.2.1.2

得到如下响应:

iso.3.6.1.2.1.2.2.1.2.2548 = STRING: "xe-4/0/1.3461"
iso.3.6.1.2.1.2.2.1.2.2549 = STRING: "xe-4/0/2.3462"
iso.3.6.1.2.1.2.2.1.2.2550 = STRING: "xe-4/0/2.3461"
iso.3.6.1.2.1.2.2.1.2.2551 = STRING: "xe-4/0/3.3462"
iso.3.6.1.2.1.2.2.1.2.2552 = STRING: "xe-4/0/3.3461"
iso.3.6.1.2.1.2.2.1.2.2557 = STRING: "xe-4/2/1.1514"
iso.3.6.1.2.1.2.2.1.2.2558 = STRING: "xe-4/2/1.1634"

由于此特定设备上有许多接口,因此省略了输出。 我需要解析这个输出,以便我只能获得物理接口。例如字符串外:

iso.3.6.1.2.1.2.2.1.2.2557 = STRING: "xe-4/2/1.1514"

我只需要提取 xe-4/2/1 等其他行。基本上,在字符 " 之后,点之前的所有内容。请注意,有这样的行:

iso.3.6.1.2.1.2.2.1.2.1664 = STRING: "xe-4/3/3"
iso.3.6.1.2.1.2.2.1.2.1665 = STRING: "xe-4/1/3.534"
iso.3.6.1.2.1.2.2.1.2.1666 = STRING: "xe-4/1/3.552"
iso.3.6.1.2.1.2.2.1.2.1667 = STRING: "xe-4/3/0.1613"
iso.3.6.1.2.1.2.2.1.2.1296 = STRING: "ae2.1464"
iso.3.6.1.2.1.2.2.1.2.1297 = STRING: "ae2.1503"
iso.3.6.1.2.1.2.2.1.2.1299 = STRING: "ae2.1596"
iso.3.6.1.2.1.2.2.1.2.1300 = STRING: "ae2.2020"

我的最终目标是从这个特定设备中提取所有物理接口。与接口相关的唯一 OID 似乎是 iso.3.6.1.2.1.2.2.1.2 并且在汇集设备时它输出所有接口,包括物理和逻辑接口。

非常感谢

【问题讨论】:

  • 您提到的 OID 是 ifDescr 并且您注意到它显示了所有现有接口。您可以通过ifType OID (1.3.6.1.2.1.2.2.1.3) 根据类型过滤接口,然后将它们映射到来自ifDescr OID 的接口名称。
  • 为什么不运行snmpget -v2c -c blablabla x.x.x.x iso.3.6.1.2.1.2.2.1.2.2557 snmpget 一个ODIsnmpwalk 用于获取ODIs 的组

标签: regex bash sed grep snmp


【解决方案1】:

使用 sed 命令

sed 's#iso.*= STRING: "\([^".]\+\).*#\1#g' my_file

编辑:上面使用 sed 命令的解释

#

我使用# 作为 sed 的分隔符..您可以使用任何其他字符,例如“%”、“~”等...使用与模式或变量中的任何字符不冲突的字符是明智的

iso.*= STRING: " - 匹配带有字符串iso后跟任意字符后跟字符串=STRING: "的模式

\\([^".]\+\\) - 这是上述模式的延续.. 这部分[^".]\+ 匹配一个或多个不是". 的字符。 \+ 表示 1 个或多个字符。请注意,我通过\( \) 封闭了这条模式。这是因为我希望 sed 记住这个模式。因为这是我包含的第一个模式,所以 sed 将此模式定义为 \1。将\1 视为第一个模式的变量名。所以在模式iso.*= STRING: " sed 之后搜索所有不是". 的字符并记住它,这就是我们的答案。我希望sed 用这个存储的模式替换整行。

.* - 匹配标记模式后的零个或多个字符。我使用它的原因是它匹配行的其余部分并将整行替换为标记的模式,即\1

注意:仅当您将整行与模式匹配,然后在正则表达式中标记部分模式以进行替换时,这才有效。如果没有找到整个模式,则不会发生替换。

使用 awk 命令

awk -v FS="( \"|[.][0-9]+\"$|\"$)" '$0~/iso.*= STRING: "/{print $2}' my_file

【讨论】:

  • 感谢 Xorg。两者都做我想做的事。我想专注于“sed”示例。如果你不介意我会再问你几个问题。因此,分解行 "'s#iso.*= STRING: "([^".]\+).*#\1#g'" 我想在您的帮助下完成它,因为我真的很想了解幕后发生了什么。
  • 我想我确实得到了如下的一部分:“s”表示搜索输入,但我不知道“#”是什么意思。接下来它计算字符串“iso”。下一个 ”。*”。这 。表示任意字符,* 表示匹配前一个表达式 0 次或多次。因此,总体上“。*”意味着匹配“iso”之后的任何内容。到目前为止,我们已经匹配了“iso.3.6.1.2.1.2.2.1.2.1665”。接下来我们有 "= STRING: "" 所以到目前为止我们已经匹配了 "iso.3.6.1.2.1.2.2.1.2.1665 = STRING: ""
  • 其余的对我来说有点难。 "(" 表示记住所有内容,直到下一个 ")" 然后 \1 告诉 sed 用 "\1" 替换我们找到的内容。 \1 计算第一组“(”和“)”标签中匹配的任何内容所以,我没有得到“s#”、“[^”。]\+”,如果你能解释一下表达式也会很好".*#\1#g" 非常感谢您的帮助。
【解决方案2】:

你可以使用这个 sed 命令:

sed -i.bak 's/\([^"]*"[^.]*\).*/\1"/' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2020-12-17
    • 2019-01-22
    • 2014-10-19
    • 2013-02-03
    • 2020-06-10
    • 1970-01-01
    相关资源
    最近更新 更多