我正在尝试创建一个 bash 脚本,无论客户端上是否安装了 OID,都以相同的方式处理 snmp 响应。
客户可以得到以下回复:
SNMPv2-SMI::mib-2.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD "
iso.3.6.1.2.1.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD "
我想得到最后一部分,1062,这是id号。这些响应共享的是 47.1.1.1.1.13.(id 号)。
无论客户端响应一开始如何,如何处理文本以仅打印 ID 号?
答案1
例如,您可以删除除数字和点后面的数字之外的所有内容:
sed -e 's/.*[0-9.]*\.\([0-9]*\).*/\1/'
解释:
.* anything
[0-9.]* digits and dots in any order
\. dot
\( start a matching group
[0-9]* digits
\) end the matching group
.* anything
所有匹配的字符串都被替换为匹配组,即数字和点之后的最后一个数字。
答案2
如果您唯一可以确定的是您想要后面的一串数字47.1.1.1.1.13.
,则可以使用以下之一:
grep -Po '47\.1\.1\.1\.1\.13.\K\d+'
sed -n 's/.*47\.1\.1\.1\.1\.13\.\([0-9]\+\).*/\1/p'
perl -lne '/47\.1\.1\.1\.1\.13\.(\d+)/ && print $1'
如果,如您的示例所示,目标字符串始终位于 before STRING
,您可以使用:
grep -Po '\d+(?= STRING)'
sed -n 's/.*\.\([0-9]\+\) STRING.*/\1/p'
perl -lne '/(\d+)(?= STRING)/ && print $1'
或者,如果目标字符串始终是第一次出现的点、数字字符串和空格(这就是您在问题中显示的内容),您可以执行以下操作:
grep -Po '^\S+\.\K\d+'
sed -n 's/^[^ \t]*\.\([0-9]\+\).*/\1/p'
perl -lne '/^\S+\.(\d+)/ && print $1' file
答案3
$ shopt -s extglob
$ resp1='SNMPv2-SMI::mib-2.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD "'
$ resp2='iso.3.6.1.2.1.47.1.1.1.1.13.1062 STRING: "GLC-SX-MMD "'
$ echo ${resp1//@(*47.1.1.1.1.13.| STRING*)}
1062
$ echo ${resp2//@(*47.1.1.1.1.13.| STRING*)}
1062