1

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

但我无法让它工作。

4

3 回答 3

1

在实践中,我可能会使用jasonwryan解决方案,但要回答为什么您的sed命令不起作用是因为您使用的是扩展正则表达式,甚至是兼容 perl 的正则表达式。要与 ERE 一起使用,您需要使用与BSD 变体或与 BSD 变体sed一起显式打开它。但是不支持 PCRE,但您可以放弃使用非捕获组,因为它在这里并没有真正的帮助。-rGNU sed-Esed

因为你只是模式匹配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正则表达式和一个文件。sedis 不会grep也不会只打印出匹配的行(虽然它当然可以,但这不是你这样做的方式)。一种方法是使用替换命令s并替换 IP 之前的所有内容和之后的所有内容:

$ 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

正则说明:

s    # sed substitute command 
/    # the delimiter marking the start of the regexp
.+   # one or more of any character
[    # start a character class
[    # character class contains a single opening square bracket 
]    # close character class (needed so single [ isn't treated as unclosed)
(    # start capture group
[    # start character class
^]+  # one or more character not an ]
]    # end character class
)    # end capture group 
.+   # one or more of any character
/    # the delimiter marking the end of the regexp and start of replacement
\1   # the first capture group
/    # the delimiter marking the end of the replacement 

是不同正则表达式风格的比较。

于 2013-09-10T07:53:43.047 回答
1

Using 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
于 2013-09-10T07:44:55.460 回答
0

您可以将括号之间的内容[]sed

sed 's/.*\[\(.*\)\].*/\1/' log.file
于 2013-09-10T07:37:40.107 回答