我有一个如下所示的日志文件:
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
但这似乎不起作用。
答案 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