这是一个任务,所以我别无选择,只能使用sed.
给定文件消息,如何提取所有IP地址并打印它们?
我第一次尝试
sed -n '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' messages
Run Code Online (Sandbox Code Playgroud)
但它什么都没印.经过一些研究,我发现sed不支持非贪婪的运营商吗?和|.
我一直在挣扎我的大脑,但如果没有非贪婪的操作员,我想不出办法做到这一点.我怎样才能做到这一点?
Gil*_*not 30
grep会更适合那里(如果你有sed,你也应该有grep):
grep -oE '((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])' messages
Run Code Online (Sandbox Code Playgroud)
这是你自己regex没有修改(测试OK)
Ste*_*eve 10
如果有GNU sed,您只需添加-r标志即可使用ERE:
sed -rn '/((1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])\.){3}(1?[0-9][0-9]?|2[0-4][0-9]|25[0-5])/p' file
Run Code Online (Sandbox Code Playgroud)
否则,您将需要转义某些字符:
sed -n '/\(\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)\.\)\{3\}\(1\?[0-9][0-9]\?\|2[0-4][0-9]\|25[0-5]\)/p' file
Run Code Online (Sandbox Code Playgroud)
这些字符包括:
(,){,}|?通常(虽然不适合您的情况)我使用以下内容来匹配IP地址:
sed -rn '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' file
Run Code Online (Sandbox Code Playgroud)
或者在兼容模式下:
sed -n '/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/p' file
Run Code Online (Sandbox Code Playgroud)