从 SNMP 中提取特定数据

从 SNMP 中提取特定数据

我已完成 SNMP 轮询以从路由器获取不同的许可证。我已成功查询信息;我现在希望能够展示它。我的输出快照是:

SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.1 = STRING: "ipbasek9"  
SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"  
SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.2.1 = STRING: "securityk9"  
SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.2.2 = STRING: "uck9"

我只想展示引号中的内容:

  • "ipbasek9"
  • "securityk9"
  • ETC。

我找到了它的正则表达式“(.*?)”,它将突出显示引号中的所有数据,但是什么命令实际上会从文本中提取数据?我已经尝试了 awk、sed、grep 的各种变体,但仍然没有任何运气。

答案1

解决方案1

grep内置了该选项,我自己有时也会使用它。
man grep

       -o, --only-matching
          Print only the matched (non-empty) parts of a matching line, with each  such  part  on  a  separate
          output line.

然后你可以使用tr删除不需要的字符:

$ tr -d '"'

测试字符串:

$ echo 'SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"' | grep -E -o '"(.*?)"' | tr -d '"'

输出:

securityk9

解决方案2

另一种方法,如果空格分隔的字段数量一致,可以使用cut(并且tr,所以仍然是 2 个管道,我确信它可以在一次运行中完成):

$ cut -d ' ' -f 4 | tr -d '"'

测试:

$ echo 'SMI::enterprises.9.9.543.1.2.3.1.3.1.1.2 = STRING: "securityk9"' | cut -d ' ' -f 4 | tr -d '"'
securityk9

解决方案3

在所有安装了 Perl 5 的 Linux 和 Unix 系统中使用perl应该是最通用和可移植的。通过管道将输出发送到:

perl -p -e 's/.*?"(\w+)"/$1/g' -

例子:

$ echo 'SNMPv2-SMI::enterprises.9.9.543.1.2.3.1.3.1.1.1 = STRING: "ipbasek9"' | perl -p -e 's/.*?"(\w+)"/$1/g' -
ipbasek9

解释:

-p           iterate over each line of input
-e           execute following code
s/foo/bar/g  substitute 'foo' with 'bar' globally, in entire line
.*?"         match any characters non-greedy, so up to first left-most double quote "
(\w+)        match and capture into $1 any word-characters (alphanumeric, underscore _, plus connector punctuation chars)
$1           substitute with with whatever was captured in first parenthesis 

相关内容