仅从命令行打印perl中的匹配行

时间:2011-02-24 00:00:41

标签: perl

我正在尝试从文件中提取所有IP地址。到目前为止,我只是在使用

cat foo.txt | perl -pe 's/.*?((\d{1,3}\.){3}\d{1,3}).*/\1/'

但这也会打印不包含匹配项的行。我可以通过grep管道来解决这个问题,但这看起来应该是不必要的,并且如果正则表达式完全匹配,可能会导致错误。

有没有更简单的方法来实现这个目标?

4 个答案:

答案 0 :(得分:22)

试试这个:

cat foo.txt | perl -ne 'print if s/.*?((\d{1,3}\.){3}\d{1,3}).*/\1/'

或:

<foo.txt perl -ne 'print if s/.*?((\d{1,3}\.){3}\d{1,3}).*/\1/'

这是我在使用Perl时可以想到的最短的选择。

然而,这种方式可能更正确:

<foo.txt perl -ne 'if (/((\d{1,3}\.){3}\d{1,3})/) { print $1 . "\n" }'

答案 1 :(得分:16)

如果你有grep,那就直接打电话给grep:

grep -Po "(\d{1,3}\.){3}\d{1,3}" foo.txt

答案 2 :(得分:12)

你已经有了一个合适的答案,使用grep来提取IP地址,但只是为了解释为什么你会看到打印不匹配的内容:

perldoc perlrun将告诉您可以在命令行上传递Perl的所有选项。

引用它:

-p   causes Perl to assume the following loop around your program, which makes it 
     iterate over filename arguments somewhat like sed:

     LINE:
     while (<>) {
         ...             # your program goes here
     } continue {
         print or die "-p destination: $!\n";
     }

您可以使用-n开关,它类似但不会自动打印,例如:

cat foo.txt | perl -ne '/((?:\d{1,3}\.){3}\d{1,3})/ and print $1'

此外,无需使用cat; Perl将打开并读取您提供的文件名,因此您可以说例如:

perl -ne '/((?:\d{1,3}\.){3}\d{1,3})/ and print $1' foo.txt

答案 3 :(得分:1)

ruby -0777 -ne 'puts $_.scan(/((?:\d{1,3}\.){3}\d{1,3})/)' file