从文件中提取特定字符串并使用grep,awk,sed输出到另一个文件

时间:2013-09-10 07:34:00

标签: regex sed awk grep

我有一个文件,它包含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

但我无法使其发挥作用。

3 个答案:

答案 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