我有一个脚本可以帮助我登录到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中。但我没有得到预期的结果。请有人指导我。谢谢。
答案 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
)。
希望这有帮助!