我有一个看起来像这样的日志文件:
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
但这似乎不起作用。
使用,在一行中打印两个匹配更加容易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
”的数组中,然后将捕获的array(a
)分隔为dot(.
)字符,并检查每个字符串是否为<=
255以确保IP地址有效。
注意:这里使用GNU awk。
另请注意,您提到的正则表达式也会打印无效的IP地址(例如:)333.222.555.666
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句