我正在尝试调试perl脚本以解析snmpwalk
包含端口详细信息的IPv6地址的表上的输出。
snmpwalk
Shell上的命令执行和结果如下:
[root@newton log]# /usr/bin/snmpwalk -v 2c -c secret localhost SNMP-TARGET-MIB::snmpTargetAddrTAddress
SNMP-TARGET-MIB::snmpTargetAddrTAddress.'2' = Hex-STRING: FD 22 1A 16 0E D3 01 00 00 00 00 00 00 10 00 41
00 A2
perl脚本尝试在snmpTargetAddrTAddress.
->之后获取值,即2,然后在之后获取值Hex-STRING
。它在代码中使用以下正则表达式
@buf = `$snmpwalk $address_oid`;
foreach (@buf) {
if (/snmpTargetAddrTAddress\.'(.+?)' = Hex-STRING: ([\w ]+)/)
my $name = $1;
my $rest= $2;
log_msg( LOG_CRIT, "Found IP $rest for $name" );
}
$ 1等于 2
$ 2等于 FD 22 1A 16 0E D3 01 00 00 00 00 00 00 10 00 41
但是我也需要00 A2
在shell中的换行符中出现的值。
我尝试了在线工具-https: //regex101.com/。它提供了正则表达式为([\ w] +)(\ n [\ w] +)。但是在代码中使用时,我没有任何输出。
以下不输出任何
if (/snmpTargetAddrTAddress\.'(.+?)' = Hex-STRING: ([\w ]+)(\n[\w ]+)/
我可能做错了什么?在线工具中的上述表达式会产生结果。如果我需要让shell输出中换行符出现的字符,我还可以使用其他哪些正则表达式?
@GMB建议后的代码:
if(/snmpTargetAddrTAddress\.'(.+?)' = Hex-STRING: ([\w\s\n]+)/) {
my $name = $1;
my $rest = $2;
log_msg( LOG_CRIT, "Found IP $rest for $name" );
}
看到的日志是: " Found IP FD 22 1A 16 0E D3 01 00 00 00 00 00 00 10 00 41 for 2"
更新:根据@zdim和@ikegami的评论,我错误地认为“ 00 A2”将是第二次迭代本身的一部分。由于它们出现在第三行,因此可以在foreach
为什么不简单地将换行符添加到允许的字符列表中呢?实际上,正如zdim所评论的,它同时\s
匹配空格和换行符,因此您可以执行以下操作:
/snmpTargetAddrTAddress\.'(.+?)' = Hex-STRING: ([\w\s]+)/
如果需要,您可以将其从解析值中删除:
use strict;
use warnings;
my $str = qq/SNMP-TARGET-MIB::snmpTargetAddrTAddress.'2' = Hex-STRING: FD 22 1A 16 0E D3 01 00 00 00 00 00 00 10 00 41\n00 A2/;
if (my ($addr, $hex) = ($str =~ /snmpTargetAddrTAddress\.'(.+?)' = Hex-STRING: ([\w\s]+)/)) {
$hex =~ s/\n/ /;
print "addr: $addr\nhex: $hex\n"
}
产量:
addr: 2
hex: FD 22 1A 16 0E D3 01 00 00 00 00 00 00 10 00 41 00 A2
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句