我正在尝试从文件中提取所有IP地址。到目前为止,我只是在使用
cat foo.txt | perl -pe 's/.*?((\d{1,3}\.){3}\d{1,3}).*/\1/'
但这也会打印不包含匹配项的行。我可以通过grep管道来解决这个问题,但这看起来应该是不必要的,并且如果正则表达式完全匹配,可能会导致错误。
有没有更简单的方法来实现这个目标?
答案 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