我已完成 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