【问题标题】:Perl to get the counter on the unique and sorted elementsPerl 获取唯一和排序元素的计数器
【发布时间】:2013-11-22 22:31:08
【问题描述】:

我有一个在 cisco 交换机上运行并执行“show mac-address-table dynamic”命令的 perl 脚本。它将数据存储在@ver 中。然后我使用正则表达式仅从 @ver 获取 mac 地址,然后根据所需的初始八位字节地址区分 mac 地址。我现在想要排序的唯一 MAC 地址以及关于唯一地址重复次数的计数器。我正在使用 linux 命令 'sort | uniq -d -c' 为它。简而言之,脚本如下:

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 |排序 |唯一的-d -c。请建议我哪里出错了。谢谢。

【问题讨论】:

    标签: regex linux perl cisco


    【解决方案1】:

    如果你有一个列表 @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 ("quote execute") 将执行分叉到操作系统,它不知道@sonic_macaddr 是什么,因为它是一个Perl 变量!在 Perl 脚本中使用哈希“排序 unic”。

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

    我不会在列表中添加“\n”:打印时添加它会更好:

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

    甚至:

    print join "\n", @sonic_macaddr ; 
    

    你永远不知道什么时候需要一个干净的 mac 地址列表;)

    【讨论】:

    • 这看起来有点我想要的。感谢您对哈希值的建议。这有助于覆盖对应部分。另外,您能否建议在您的情况下我应该怎么做才能获得输出,例如:1 2 a 2 c 2。这样的mac地址和重复次数。谢谢。
    猜你喜欢
    • 2012-04-28
    • 2020-04-14
    • 2021-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    相关资源
    最近更新 更多