regex - 使用换行符解析的正则表达式
问题描述
我正在尝试调试一个 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
解决方案
为什么不简单地将换行符添加到允许的字符列表中呢?实际上,正如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
推荐阅读
- c# - 是否有任何命令可以让我检查是否有任何类具有从中创建的对象?
- mysql - 如何修复仅返回 0
- deep-learning - 使用在不同数据集上训练的 cnn 模型
- sql - 需要用于 URL 检查的正则表达式?
- jquery - 500 internal server error......Spatie media throwing file not found 异常
- java - Java如何防止使用Random类创建重复数字?
- database - 主键约束的最佳实践?
- kubernetes - GCP 上的 Kubernetes 存储:此上下文中不允许映射值错误
- c# - 为什么会出现错误,说变量未定义。(统一)
- date - 如何在 CMD 中复制伪变量?我正在尝试自动将部分日期复制到剪贴板