开发者

Only print matching lines in perl from the command line

I'm trying to extract all ip addresses from a file. So far, I'm just using

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

but this also prints lines that don't contain a match. I can fix this by piping through grep, but this seems like it ought to be unnecessary, and could lead to errors if the regexes don't match up perfectly.

Is there a simpler way to开发者_高级运维 accomplish this?


Try this:

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

or:

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

It's the shortest alternative I can think of while still using Perl.

However this way might be more correct:

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


If you've got grep, then just call grep directly:

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


You've already got a suitable answer of using grep to extract the IP addresses, but just to explain why you were seeing non-matches being printed:

perldoc perlrun will tell you about all the options you can pass Perl on the command line.

Quoting from it:

-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";
     }

You could have used the -n switch instead, which does similar, but does not automatically print, for example:

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

Also, there's no need to use cat; Perl will open and read the filenames you give it, so you could say e.g.:

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


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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜