如何使用grep从日志文件中提取IP地址和日期/时间字符串?

时间:2019-05-31 14:39:47

标签: grep

我有一个如下所示的日志文件:

May 25 05:34:16 server sshd[1203]: Received disconnect from 192.0.2.2 port 39102:11
May 25 05:34:16 server sshd[1203]: Disconnected from 192.0.2.1 port 39102 

现在我想使用grep开头提取所有ip地址和日期/时间字符串。我已经知道如何获取ips了:

grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' /log.txt

和日期/时间:

grep -o '[A-Z][a-z][a-z] [0-3][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]' /log.txt

但是我不知道如何以类似的格式同时获取两者:

May 25 05:34:16 192.0.2.1

我读过类似的东西:

 grep -oE 'match1|match2' /log.txt

但这似乎不起作用。

3 个答案:

答案 0 :(得分:0)

使用awk更容易在一行中打印两个匹配项,随后将打印日期(通过打印$1,$2,$3和所有有效IP地址

gawk  '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/,a);split(a[0],b,".")} b[1]<=255&& b[2]<=255 && b[3]<=255 && b[4]<=255 &&length(a[0]){print $1,$2,$3, a[0]}' log_file
May 25 05:34:16 192.0.2.2
May 25 05:34:16 192.0.2.1

说明::首先使用match函数捕获格式为digit.digit.digit.digit的所有字符串,并将它们存储到名为“ a”的数组中,然后拆分捕获的数组( a)中包含点号({.),并检查每个字符是否为<= 255,以确保IP地址有效。

请注意:此处使用GNU awk。

还请注意,您提到的正则表达式也会打印无效的IP地址(例如333.222.555.666)。

答案 1 :(得分:0)

您可以在捕获组中使用2种模式,并使用sed在替换模式中使用这些模式:

sed -i -E 's#^([A-Z][a-z][a-z] [0-3][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]).* ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*$#\1 \2#g' log.txt

这将匹配:

  • ^字符串的开头
  • ([A-Z][a-z][a-z] [0-3][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9])您的日期/时间类似模式
  • .*匹配任何char 0次以上
  • ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})匹配空间遵循您的ip like模式
  • .*匹配任何char 0次以上
  • $字符串结尾

结果

May 25 05:34:16 192.0.2.2
May 25 05:34:16 192.0.2.1

答案 2 :(得分:0)

在任何UNIX盒子上的任何外壳中都有任何awk:

$ awk '{print $1, $2, $3, $(NF-2)}' file
May 25 05:34:16 192.0.2.2
May 25 05:34:16 192.0.2.1