我有一个文件,它包含ff字符串
2013-09-08 21:00:54 SMTP connection from [78.110.75.245]:5387 (TCP/IP connection count = 20)
2013-09-08 21:00:54 SMTP connection from [188.175.142.13]:34332 (TCP/IP connection count = 20)
2013-09-08 21:45:41 SMTP connection from [58.137.11.145]:51984 (TCP/IP connection count = 20)
2013-09-08 21:49:26 SMTP connection from [109.93.248.151]:22273 (TCP/IP connection count = 20)
2013-09-08 21:49:27 SMTP connection from [37.131.64.203]:7906 (TCP/IP connection count = 20)
我想要做的只是提取IP地址并将其保存到文件中。
我从这个
开始sed '^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$' file > ips
但我无法使其发挥作用。
答案 0 :(得分:1)
使用awk
:
awk -F'[][]' '{print $2}' log.file > addresses
78.110.75.245
188.175.142.13
58.137.11.145
109.93.248.151
37.131.64.203
答案 1 :(得分:1)
在实践中,我可能会使用 jasonwryan 解决方案,但要回答为什么sed
命令不起作用是因为您正在使用extended regular expression甚至perl兼容的正则表达式。要将ERE与sed
一起使用,您需要使用带有-r
的{{1}}或带有BSD变体的GNU sed
明确启用它。但是-E
不支持PCRE,但您可以放弃使用非捕获组,因为它无论如何都不会对此有所帮助。
由于您只是模式匹配sed
可能比grep
更好:
sed
请注意,锚点也需要删除,即$ grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' file
78.110.75.245
188.175.142.13
58.137.11.145
109.93.248.151
37.131.64.203
和^
,因为您要匹配的模式不是从字符串的开头开始,也不是在结束时结束。 $
默认情况下也不支持扩展正则表达式,因此使用grep
并且-E
仅打印行的匹配部分而不是整行。
最后一个问题是你刚刚给出了-o
和正则表达式以及一个文件。 sed
不是sed
,并且不会打印出与匹配的行(尽管它当然可以,但这不是你怎么做的)。一种方法是使用替换命令grep
并替换IP之前的所有内容以及之后的所有内容:
s
Regexplanation:
$ sed -r 's/.+[[]([^]]+).+/\1/' file
78.110.75.245
188.175.142.13
58.137.11.145
109.93.248.151
37.131.64.203
Here是不同正则表达式的比较。
答案 2 :(得分:0)
您可以将括号[]
与sed
:
sed 's/.*\[\(.*\)\].*/\1/' log.file