【问题标题】:Grep elements from array that exists in output输出中存在的数组中的 Grep 元素
【发布时间】:2016-09-07 12:06:51
【问题描述】:

有什么方法可以使用 grep 来仅查找特定数组中存在的元素? 例如:

my @IPS ={"10.20.30","12.13.14","30.40.50"};

my $cmd = `netstat -Aa | grep -c IPS[0] OR IPS[1] OR IPS[2]  `

print "$cmd";

我希望 cmd 返回存在于 netstat 命令输出中的 IPS 的数量(仅在数组中找到的那些)。 我知道我可以使用“|”或条件,但假设我不知道数组中元素的数量。

【问题讨论】:

    标签: arrays perl grep


    【解决方案1】:

    您的@IPS 数组不包含您认为它包含的内容。我想你可能想要:

    my @IPS = ("10.20.30","12.13.14","30.40.50");
    

    我会这样写:

    my @IPS = qw(10.20.30 12.13.14 30.40.50);
    

    我知道我可以使用“|”或条件,但假设我不知道数组中元素的数量

    我认为这根本不重要。

    # Need quotemeta() to escape the dots
    my $IP_str = join '|', map { quotemeta $_ } @IPS;
    my $IP_re  = qr/$IP_str/;
    
    # Keep as much of the processing as possible in Perl-space
    my @found = grep { /$IP_str/ } `netstat -Aa`;
    say scalar @found;
    

    正则表达式的替代方法是将@IPS 转换为哈希。

    my %IP = map { $_ => 1 } @IPS;
    my @found = grep { $IP{$_} } `netstat -Aa`;
    say scalar @found;
    

    更新:实际上,最后一个例子是行不通的。在匹配哈希之前,您需要从netstat 输出中提取 IP 地址。但我把它留在那里以防它激发任何人扩展它。

    【讨论】:

    • 感谢您的详细回答,我尝试了正则表达式的替代方法,但该数组不包含任何内容。在这种情况下,我如何将 IPS 插入 IPS 阵列是否重要?因为我通过使用命令来做到这一点:我的@IPS = $cmd | tr " " "\n";咀嚼@IPS
    • 查看我的更新。该替代版本不起作用。数组的填充方式无关紧要 - 但您需要确保元素包含 IP 地址。例如,将换行符也包含在内非常容易 - 但这是行不通的。
    • 你需要停止向外部程序传递这么多东西。 Perl 有自己完美可用的tr/.../.../ 运算符:-)
    • 感谢您的建议,我会尽快尝试第一个解决方案并批准它是否有效。
    【解决方案2】:

    一种快速而肮脏的方法是利用 perl 中的 $" 变量:

    my @IPS =("10.20.30","12.13.14","30.40.50");
    local $"='|';
    my $cmd = `netstat -Aa | grep '@IPS' | wc -l`
    print "$cmd";
    

    这个想法是$" 控制数组变量在插入一些引号时如何出现。因此,通过说$"='|',我们可以将@IPS 数组插入为由| 分隔的元素的串联。 注意:只有在您信任 @IPS 的来源时才应该使用它,例如如果您在代码中自己键入。如果它来自不受信任的外部来源,则上述技巧可能很危险。

    编辑:如果@IPS确实来自不受信任的来源,您可以先验证它

    /^[\d.]+$/ or die "Invalid IP address" for @IPS;
    

    【讨论】:

    • 嗨redneb,这是一个我不知道的非常好的技巧。但这对我不起作用,尽管输出中有 IPS,但尝试执行此操作时我得到的值为 0。你确定这条线“netstat -Aa | grep '@IPS' | wc -l”吗?
    • 好吧,我不是自己输入的,我是从外部来源获取的,这就是为什么我无法知道阵列中的 IPS 数量的原因。你知道有其他方法吗?
    • 谢谢,我试试这个。
    猜你喜欢
    • 2016-12-08
    • 2014-09-13
    • 2011-11-03
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 2016-09-05
    相关资源
    最近更新 更多