Bash 脚本处理 snmp 文本以仅打印所需的 ID

Bash 脚本处理 snmp 文本以仅打印所需的 ID

我正在尝试创建一个 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

相关内容