解析snmpwalk输出

时间:2015-02-02 17:54:01

标签: regex bash sed grep snmp

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

我正在使用命令轮询我的Juniper设备:

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,当汇集设备时,它输出所有接口,包括物理和逻辑。

非常感谢

2 个答案:

答案 0 :(得分:0)

您可以使用此sed命令:

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

答案 1 :(得分:0)

使用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