2013-11-22 54 views
0

我有一個perl腳本,它在cisco交換機上運行並執行'show mac-address-table dynamic'命令。它將數據存儲在@ver中。然後,我使用正則表達式僅從@ver獲取mac地址,然後根據所需的初始八位組地址區分mac地址。我現在想要排序以及唯一的MAC地址和計數器一樣,重複唯一地址的次數。我正在使用linux命令'sort | uniq -d -c'。爲了解釋它在很短的腳本如下:Perl獲取唯一和排序元素的計數器

my @ver = $session->cmd('show mac-address-table dynamic'); 

my $mac_addr; 
my @sonic_macaddr; 
my @final_macaddr; 

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/^(0018)[.]/ or $mac_addr =~ m/^(a0ce)[.]/ or $mac_addr =~ m/^(0009)[.]/){ 
        push (@sonic_macaddr, $mac_addr."\n"); 
        @final_macaddr = qx (@sonic_macaddr | sort | uniq -d -c); 
        print @final_macaddr; 
       } 
     } 
} 
$session->close() 

如果我使用QX在腳本本身來執行它,我沒有得到所需要的輸出,否則它工作正常,在命令行上。例如perl.pl |排序| uniq -d -c。請建議我去哪裏錯了。謝謝。

回答

3

如果你有一個列表@list,你想從它獨特的元素,你必須使用一個哈希:

my @list = ('c', 'c', 'a', 'a', '1', '1') ; 
my %unic ; 
for my $it (@list) { 
$unic{$it}++ 
} 

for my $k (sort keys %unic) { 
    print $k, " " 
} 

在你的代碼中,我看到一堆不同的問題,但很難提出一個沒有解析源文件的解決方案。

@final_macaddr = qx (@sonic_macaddr | sort | uniq -d -c); 

Perl的成語qx(「報價執行」)叉了執行的操作系統,不知道@sonic_macaddr是什麼,因爲它是一個Perl的變量!在Perl腳本中使用散列來「排序unic」。打印即當你更好的將其添加:

for my $it (@sonic_macaddr) { 
    print $it, "\n" ; 
} 

甚至:

print join "\n", @sonic_macaddr ; 

push (@sonic_macaddr, $mac_addr."\n"); 

我不會推 「\ n」 的名單內永遠不知道你什麼時候需要一個乾淨的mac地址列表;)

+0

這看起來有點我想要的。感謝您對散列內容的建議。這有助於覆蓋櫃檯部分。另外,你能建議我應該怎麼做才能在你的情況下得到輸出:1 2 a 2 c 2.這樣的MAC地址和重複的次數。謝謝。 – deep

+1

這將是'print $ k','$ unic {$ k},「\ n」' – zlr

相關問題