0

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 に保存しようとしています。しかし、私は望ましい結果を得ていません。誰か私を案内してください。ありがとうございました。

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 アドレスは、結果のリストの 2 番目の要素です (まだ設定する必要がある場合$mac_addr)。

お役に立てれば!

于 2013-11-14T01:30:23.103 に答える