从shell脚本中提取snmpdump值(使用精确的MIB)

时间:2016-11-09 14:52:00

标签: bash

我有一些SNMP转储:

  1.3.6.1.2.1.1.2.0|5|1.3.6.1.4.1.9.1.1178
  1.3.6.1.2.1.1.3.0|7|1881685367
  1.3.6.1.2.1.1.4.0|6|""
  1.3.6.1.2.1.1.5.0|6|"hgfdhg-4365.gfhfg.dfg.com"
  1.3.6.1.2.1.1.6.0|6|""
  1.3.6.1.2.1.1.7.0|2|6
  1.3.6.1.2.1.1.8.0|7|0
  1.3.6.1.2.1.1.9.1.2.1|5|1.3.6.1.4.1.9.7.129
  1.3.6.1.2.1.1.9.1.2.2|5|1.3.6.1.4.1.9.7.115

并且需要在1.3.6.1.2.1.1.2.0 | 5 |之后grep第一个字符串中的所有数据,但不要在grep本身中包含此字符串的开头。所以,我必须在grep中收到1.3.6.1.4.1.9.1.1178。我试过使用正则表达式:

  \b1.3.6.1.2.1.1.2.0\|5\|\s*([^\n\r]*)

但没有任何成功。如果正则表达式或grep实际上是正确的工具,您能帮我找到正确的正则表达式吗?否则,我应该考虑使用哪些工具?

2 个答案:

答案 0 :(得分:3)

借助GNU grep + PCRE支持,您可以使用Perl' \K标记来丢弃匹配字符串的一部分:

grep -Po "1\.3\.6\.1\.2\.1\.1\.2\.0\|5\|\K.*"

-P启用Perl的正则表达式模式和-o开关输出到匹配的部分而不是整行。

我不得不逃避在Perl正则表达式中具有特殊含义的字符,但这可以通过123建议,通过将字符包含在\Q\E之间进行字面解释来避免:

grep -Po "\Q1.3.6.1.2.1.1.2.0|5|\E\K.*"

我通常会使用sed解决此问题,如下所示:

sed -n 's/1\.3\.6\.1\.2\.1\.1\.2\.0|5|\(.*\)/\1/p'

-n标志禁用隐式输出,搜索和替换命令将从行中删除搜索到的前缀,保留相关部分的打印。

必须对GNU Basic正则表达式(BRE)中具有特殊含义的字符进行转义,在本例中仅为.。另请注意,分组令牌为\(\),而不是通常的()

答案 1 :(得分:0)

另一种方法是在本机shell中,没有任何正则表达式。考虑:

prefix='1.3.6.1.2.1.1.2.0|5|'
while read -r line; do
  [[ $line = "$prefix"* ]] && printf '%s\n' "${line#$prefix}"
done

如果您的原始字符串通过管道传输到while read循环,则输出正好是1.3.6.1.4.1.9.1.1178