Perl操纵cisco switch命令

时间:2013-11-14 00:15:58

标签: regex perl cisco

我有一个脚本可以帮助我登录到cisco开关,然后运行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中。但我没有得到预期的结果。请有人指导我。谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

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

希望这有帮助!