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

jon*_*rry 14 perl

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

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

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

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

Mik*_*kel 22

试试这个:

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

要么:

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

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

但是这种方式可能更正确:

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

  • `&lt;foo.txt perl` 太棒了!我总是使用`cat foo.txt | perl` 或 `perl &lt;foo.txt` ... (2认同)

Dav*_*nan 16

如果你有grep,那么直接调用grep:

grep -Po "(\d{1,3}\.){3}\d{1,3}" foo.txt
Run Code Online (Sandbox Code Playgroud)

  • ** - P**Perl正则表达式(PCRE)** - o**仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行 (3认同)
  • grep命令执行此操作 - 它是`o`开关:仅显示与PATTERN匹配的行的一部分 (2认同)
  • 重要提示:并非所有版本的grep都支持`-P`.OSX附带的版本,特别是在2013年的某个时候打破了. (2认同)

Dav*_*ous 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";
     }
Run Code Online (Sandbox Code Playgroud)

你可以使用-n开关代替它,但它不会自动打印,例如:

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

此外,没有必要使用cat; Perl会打开并读取你给它的文件名,所以你可以说:

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