sh 脚本中的正则表达式和 sed 无法正确评估

Regex and sed in sh script not evaluating properly

首先post在这里。尝试使用正则表达式仅捕获来自 SNMP 回复的整数输出。我已经使用正则表达式测试器得出正确的模式匹配,但 sed 拒绝输出结果。现在这只是一个原始的事实调查脚本,它会变得更复杂,但现在这是我的绊脚石。

snmpget语句每一行的回复是:

IF-MIB::ifInOctets.1001 = Counter32: 692749329
IF-MIB::ifOutOctets.1001 = Counter32: 3119381688

我只想捕获 "Counter32: " 之后的值,而正则表达式 (?<=: )(\d+) 在我可以在网上找到的测试器中实现了这一点。

#!/bin/sh
SED_IFACES="-e '/(?<=: )(\d+)/g'"
INTERNET_IN=`snmpget -v 2c -c public 123.45.678.9 1.3.6.1.2.1.2.2.1.10.1001` | eval sed $SED_IFACES
INTERNET_OUT=`snmpget -v 2c -c public 123.45.678.9 1.3.6.1.2.1.2.2.1.16.1001` | eval sed $SED_IFACES
echo $INTERNET_IN
echo $INTERNET_OUT

你可以做到

sed 's/^.*Counter32: \(.*\)$//'

它捕获值并用 \1 打印出来。

另请注意,您在示例中使用了 Perl 正则表达式,而 sed 不支持这些。它还缺少替换 "s/" 部分。

$ cat file
IF-MIB::ifInOctets.1001 = Counter32: 692749329
IF-MIB::ifOutOctets.1001 = Counter32: 3119381688

$ awk '{print $NF}' file
692749329
3119381688

$ sed 's/.* //' < file
692749329
3119381688