我有一些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
实际上是正确的工具,您能帮我找到正确的正则表达式吗?否则,我应该考虑使用哪些工具?
答案 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
。