Perl一行命令+匹配IP地址

3
我正在尝试构建一个Perl一行脚本,可以从文件中精确匹配IP地址,并打印匹配的IP地址。如果IP不匹配,则不会打印IP地址。
注意:在IP地址的左/右侧 [left]xxx.xxx.xxx.xxx[right] - 可以是任何字符,但IP本身必须完全匹配。
问题在于无论我在echo之后放什么,Perl都会打印任何字符串。请指导我的语法问题在哪里?
以下是一些示例:
     # export IP=23.45.7.0

应该匹配IP地址

      # echo 23.45.7.0 | perl  -pe 'next if /^*#/;/(\b|\D)$ENV{IP}(\b|\D)/'
        23.45.7.0

不应匹配该IP地址

       # echo 123.45.7.0 | perl  -pe 'next if /^ *#/; /(\b|\D)$ENV{IP}(\b|\D)/'
         123.45.7.0

应该匹配 IP 地址

     # echo IP23.45.7.0IP | perl -pe 'next if /^ *#/; /(\b|\D)$ENV{IP}(\b|\D)/'
       IP23.45.7.0IP

不应匹配IP地址

       # echo 23.45.7.00 | perl  -pe 'next if /^ *#/; /(\b|\D)$ENV{IP}(\b|\D)/'
         23.45.7.00
2个回答

1

如果要匹配常见的模式,您可以查看Regexp::Common,在这种情况下,特别是Regexp::Common::net

根据您的规格:

echo 10.11.12.13|perl -MRegexp::Common=net -nE '$_=~/^$RE{net}{IPv4}{-keep}$/ and say $1'

10.11.12.13

...而这个无效的地址没有匹配:

echo 10.11.1200.13|perl -MRegexp::Common=net -nE '$_=~/^$RE{net}{IPv4}{-keep}$/ and say $1'

1

您需要去除多余的部分。此外,您应该转义 $IP 中的点,以便它不匹配例如 23x45y7z0。例如:

#!/usr/bin/perl
use strict;

my $ip = quotemeta($ENV{IP});

while (<>) {
    next if (/^ *$/);
    # try to replace everything by just the IP,
    # print if the line matched
    s/^.*(${ip}).*$/$1/ && print;
}

一个丑陋的“一行代码”(去掉换行符以减少实际行数和可读性):
perl -e 'my $ip = quotemeta($ENV{IP});
    while (<>) {
        next if (/^ *$/);
        s/^.*(${ip}).*$/$1/ && print;
    }'

这里似乎出现了问题,因为-p会在不匹配时打印解析的行(请参阅man perlrun以获取说明)。例如,您可以通过以下方式来防止这种情况:

perl -pe 'my $ip = quotemeta($ENV{IP});
    next if (/^ *$/);
    if (s/^.*(${ip}).*$/$1/) {
        print;
    } else { 
        $_ = ""; 
    }'

如何在Perl中编写一行代码(因为我需要将Perl一行代码添加到我的ksh脚本中) - user1121951
问题是,如果IP=23.45.7.00或IP=123.45.7.0,则它也会打印IP,但它不应该打印它,请参见我的问题中的示例。 - user1121951
以下是我从我的 Linux 机器上获取的内容:# echo "23.45.7.00" | perl -e 'my $ip = quotemeta($ENV{IP}); > while (<>) { > next if (/^ $/); > s/^.(${ip}).*$/$1/ && print; }',它会打印出 IP = 23.45.7.0。 - user1121951
@Eytan,脚本没有解释数字 - 如果您在脚本的环境中设置IP=23.45.7.0,请不要期望它打印23.45.7.00(而不是一个尾随零)。 - peterph
@Eytan 不,如果IP地址不包含在其中,脚本不会打印任何行的任何部分。 - peterph
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接