首页 > 解决方案 > 使用换行符解析的正则表达式

问题描述

我正在尝试调试一个 perl 脚本来解析snmpwalk包含 IPv6 地址和端口详细信息的表上的输出。

shell上的snmpwalk命令执行和结果如下:

[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

标签: regexstringperl

解决方案


为什么不简单地将换行符添加到允许的字符列表中呢?实际上,正如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

推荐阅读