我正在尝试从文件中提取所有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)
Dav*_*nan 16
如果你有grep,那么直接调用grep:
grep -Po "(\d{1,3}\.){3}\d{1,3}" foo.txt
Run Code Online (Sandbox Code Playgroud)
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)
| 归档时间: |
|
| 查看次数: |
19197 次 |
| 最近记录: |