我想在Perl中编写一个解析脚本,从这些数据中打印出所有“接口名称”:
interfaces.ifTable.ifEntry.ifDescr.1 : OCTET STRING- (ascii): (hex): length = 30
0: 53 6f 66 74 77 61 72 65 20 4c 6f 6f 70 62 61 63 Software Loopbac
16: 6b 20 49 6e 74 65 72 66 61 63 65 20 31 00 -- -- k Interface 1...
interfaces.ifTable.ifEntry.ifDescr.2 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 53 53 WAN Miniport (SS
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............
interfaces.ifTable.ifEntry.ifDescr.3 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 4c 32 WAN Miniport (L2
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............
我想提取所有三个接口的名称,如(“Sotware Loopback Interface 1”,“WAN Miniport(SSTP)”,“WAN Miniport(L2TP)”),并进行进一步处理。我尝试使用正则表达式,但没有luch。有没有简单的方法来做到这一点?提前谢谢!
答案 0 :(得分:1)
以下是一个快速而脏的perl脚本,它将根据示例输入执行您想要的操作。它不会非常优雅地处理输入格式的更改。我编写了脚本来从文件中获取输入,您需要更改它。
open(INPUT, "interfaces.txt");
my $interface;
while(<INPUT>) {
if (/^\s*0:/) {
$interface = substr($_, 60, 16);
} elsif (/^\s*16:/) {
$interface .= substr($_, 61, 16);
$interface =~ s/\.+$//;
print $interface, "\n";
}
}
close(INPUT);
答案 1 :(得分:1)
这是另一个脏的perl脚本。根据需要将您的数据读入$ text。正则表达式查找每个十六进制转储行的模式。然后,连接线将十六进制值重新组合回字符串,并将其附加到当前累积的接口名称。 mttrb更简单。 ;)
$text =<<EOM;
interfaces.ifTable.ifEntry.ifDescr.1 : OCTET STRING- (ascii): (hex): length = 30
0: 53 6f 66 74 77 61 72 65 20 4c 6f 6f 70 62 61 63 Software Loopbac
16: 6b 20 49 6e 74 65 72 66 61 63 65 20 31 00 -- -- k Interface 1...
interfaces.ifTable.ifEntry.ifDescr.2 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 53 53 WAN Miniport (SS
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............
interfaces.ifTable.ifEntry.ifDescr.3 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 4c 32 WAN Miniport (L2
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............
EOM
$interface = "";
foreach $line (split(/\n/, $text)) {
next unless $line =~ /\b(\d+):\s+((?:[0-9a-fA-F-]{2} ){16})/;
if ($1 == 0) {
print "$interface\n" if $interface;
$interface = "";
}
$interface .= join('', map { chr(hex($_)) } grep { $_ ne '--' && $_ ne '00' } split(/ /, $2));
}
print "$interface\n" if $interface;
要解释连接线,该行中会出现以下情况。
答案 2 :(得分:1)
通过使用段落模式(设置$/ = ""
),您可以读取每个记录并单独处理这些行。使用字段上的固定split
在空格上使用LIMIT
来抓取最后一个字段似乎是最容易的,因为十六进制数的数量似乎是常量,我们想要最后一个字段。
use strict;
use warnings;
use Data::Dumper;
$/ = ""; # paragraph mode keeps lines together
while (<DATA>) {
chomp; # removes two newlines after we changed $/
my ($hdr, @data) = split /\n/; # header + 2 lines
my ($interface, @nums) = getdata(@data);
print Dumper $interface;
}
sub getdata {
my (@hex, $str);
my @data = @_;
for (@data) {
push @hex, split(' ', $_, 18); # LIMIT set to 18
$str .= pop @hex; # last field is our string
}
return $str, @hex; # return everything, why not?
}
__DATA__
interfaces.ifTable.ifEntry.ifDescr.1 : OCTET STRING- (ascii): (hex): length = 30
0: 53 6f 66 74 77 61 72 65 20 4c 6f 6f 70 62 61 63 Software Loopbac
16: 6b 20 49 6e 74 65 72 66 61 63 65 20 31 00 -- -- k Interface 1...
interfaces.ifTable.ifEntry.ifDescr.2 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 53 53 WAN Miniport (SS
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............
interfaces.ifTable.ifEntry.ifDescr.3 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 4c 32 WAN Miniport (L2
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............
<强>输出:强>
$VAR1 = 'Software Loopback Interface 1...';
$VAR1 = 'WAN Miniport (SSTP).............';
$VAR1 = 'WAN Miniport (L2TP).............';
答案 3 :(得分:1)
使用正则表达式的另一种解决方案。
use strict ;
use warnings;
my $Data = '
interfaces.ifTable.ifEntry.ifDescr.1 : OCTET STRING- (ascii): (hex): length = 30
0: 53 6f 66 74 77 61 72 65 20 4c 6f 6f 70 62 61 63 Software Loopbac
16: 6b 20 49 6e 74 65 72 66 61 63 65 20 31 00 -- -- k Interface 1...
interfaces.ifTable.ifEntry.ifDescr.2 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 53 53 WAN Miniport (SS
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............
interfaces.ifTable.ifEntry.ifDescr.3 : OCTET STRING- (ascii): (hex): length = 20
0: 57 41 4e 20 4d 69 6e 69 70 6f 72 74 20 28 4c 32 WAN Miniport (L2
16: 54 50 29 00 -- -- -- -- -- -- -- -- -- -- -- -- TP).............
';
foreach my $Record ( $Data =~ m#\G(.+?)(?:(?=^\s*$)|\z)#gsm) {
my $Interface = '';
foreach ( split /\n/, $Record ) {
next if /^\s*$/;
next if /OCTET STRING/i;
(m#^[^:]+:(?:\s*(?:\w\w|--)\s*){16}(.+)$#);
$Interface .= "$1";
}
print "$Interface\n";
}