[英]Perl REGEX on mac address
我通過perl腳本在cisco交換機上使用命令“ show mac-address-table dynamic”。 輸出結果如下:
Legend: * - primary entry
age - seconds since last seen
n/a - not available
vlan mac address type learn age ports
------+----------------+--------+-----+----------+--------------------------
* 14 782b.cb87.b085 dynamic Yes 5 Gi4/39
* 400 0017.c59a.23aa dynamic Yes 15 Gi3/37
* 400 0017.c59a.23aa dynamic Yes 5 Gi1/27
* 400 0017.c50f.704d dynamic Yes 5 Gi13/19
* 400 0006.8b05.a915 dynamic Yes 10 Gi5/29
* 400 c0ea.e414.2f29 dynamic Yes 10 Gi3/37
* 400 0017.c53e.166d dynamic Yes 5 Gi1/12
我正在編寫一個腳本,使其僅取出具有前4個初始數字的mac地址,例如0017.c5或0006b或c0ea.e4。 另外,它應該顯示重復的次數。 我嘗試編寫以下代碼:
for my $line (@ver) {
if (my ($mac_addr) = $line =~ /((?:[0-9a-f]{4}\.){2}[0-9a-f]{4})/) {
$mac_addr = $1;
if ($mac_addr =~ m/^(0017.c5)[0-9a-f]{2}.[0-9a-f]{4}/ or $mac_addr =~ m/^(c0ea.e5)[0-9a-f]{2}.[0-9a-f]{4}/ or $mac_addr =~ m/^(0006.b)[0-9a-f]{3}.[0-9a-f]{4}/){
push (@sonic_macaddr, $mac_addr);
for $it (@sonic_macaddr){
$uniq{$it}++;
}
}
}
}
print (Dumper(\%uniq));
我沒有得到所需的結果。 請有人可以指導我哪里出問題了嗎? 謝謝。
這場比賽將永遠失敗:
$mac_addr =~ m/^(0017.c5)[.]/
查找所需的前綴,后跟一個句點。 您的mac地址中的第8個字符都沒有句號。
也許下面的腳本重做將對您有所幫助:
use strict;
use warnings;
my @ver = <DATA>;
my @mac_prefixes = qw(0017.c5 c0ea.e5 0006.b);
my $mac_prefixes = '(?:' . join('|', map quotemeta, @mac_prefixes) . ')';
my @sonic_macaddr;
my %uniq;
for my $line (@ver) {
if (my ($mac_addr) = $line =~ /((?:[0-9a-f]{4}\.){2}[0-9a-f]{4})/) {
$mac_addr = $1;
if ($mac_addr =~ m/^($mac_prefixes)/){
my $prefix = $1;
push (@sonic_macaddr, $mac_addr);
$uniq{$prefix}++;
}
}
}
use Data::Dump;
dd \%uniq;
dd \@sonic_macaddr;
__DATA__
Legend: * - primary entry
age - seconds since last seen
n/a - not available
vlan mac address type learn age ports
------+----------------+--------+-----+----------+--------------------------
* 14 782b.cb87.b085 dynamic Yes 5 Gi4/39
* 400 0017.c59a.23aa dynamic Yes 15 Gi3/37
* 400 0017.c59a.23aa dynamic Yes 5 Gi1/27
* 400 0017.c50f.704d dynamic Yes 5 Gi13/19
* 400 0006.8b05.a915 dynamic Yes 10 Gi5/29
* 400 c0ea.e414.2f29 dynamic Yes 10 Gi3/37
* 400 0017.c53e.166d dynamic Yes 5 Gi1/12
首先,您的正則表達式有問題。 只需從正則表達式中刪除[.]
。
其次,將結果推入@sonic_macaddr
數組,然后為每個匹配項增加$uniq
。 它給您計數錯誤。 因此,刪除該部分。
這是修改后的if塊外觀。
if ($mac_addr =~ m/^(0017.c5)/ or $mac_addr =~ m/^(c0ea.e5)/ or $mac_addr =~ m/^(0006.b)/){
$uniq{$mac_addr}++;
}
輸出樣本數據:
$VAR1 = {
'0017.c53e.166d' => 1,
'0017.c59a.23aa' => 2,
'0017.c50f.704d' => 1
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.