0

我有一个脚本可以帮助我登录到思科交换机,然后运行 ​​mac-address table 命令并将其保存到数组@ver。脚本如下:

#!/usr/bin/perl 
use strict;
use warnings;
use Net::Telnet::Cisco;

my $host = '192.168.168.10';

 my $session = Net::Telnet::Cisco->new(Host => $host, -Prompt=>'/(?m:^[\w.&-]+\s?(?:\(config[^\)]*\))?\s?[\$#>]\s?(?:\(enable\))?\s*$)/');

$session->login(Name => 'admin',Password => 'password');
my @ver = $session->cmd('show mac-address-table dynamic');
for my $line (@ver)
{
    print "$line";
    if ($line =~ m/^\*\s+\d+\s+(([0-9a-f]{4}[.]){2}[0-9a-f]{4})\s+/ ){
            my $mac_addr = $1;
            print ("$mac_addr \n");
     }
}
$session->close();

它得到以下结果:

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  c0ea.e402.e711   dynamic  Yes          5   Gi6/17
*  400  c0ea.e45c.0ecf   dynamic  Yes          0   Gi11/43
*  400  0050.5677.c0ba   dynamic  Yes          0   Gi1/27
*  400  c0ea.e400.9f91   dynamic  Yes          0   Gi6/3

现在,通过上面的脚本,我试图获取 mac 地址并将其存储在 $mac_addr 中。但我没有得到想要的结果。请有人指导我。谢谢你。

4

2 回答 2

2

当你说你没有得到想要的结果时,我不清楚。我确实注意到您是先打印$line然后再打印$mac_addr,此外您的表情似乎匹配。

regular expression匹配您想要的数据。

如果你只是想要比赛,你可以做..

for my $line (@ver) {
   if (my ($mac_addr) = $line =~ /((?:[0-9a-f]{4}\.){2}[0-9a-f]{4})/) {
     print $mac_addr, "\n";
   }
}

输出

782b.cb87.b085
c0ea.e402.e711
c0ea.e45c.0ecf
0050.5677.c0ba
c0ea.e400.9f91
于 2013-11-14T01:16:32.407 回答
1

如果要打印出 mac 地址,可以执行以下操作:

/^\*/ and print +(split)[2], "\n" for @ver;

请注意,split如果它以*;开头,则它是行(隐含在空格上)mac 地址是结果列表中的第二个元素(以防您仍然需要设置$mac_addr)。

希望这可以帮助!

于 2013-11-14T01:30:23.103 回答