我想分析一个日志文件,并搜索一个IP地址。日志文件如下所示:
<date> -> <IP address>
例如:
2016-06-02 11:46:33 +0200 -> 86.171.55.134
所以我想选择包含给定IP的最后一行,并且该行不是以今天的日期(2016-06-02)开头,不幸的是,我的第一次尝试不起作用:
tac logfile.txt|grep -P '^(?<!2016-06-03).*?86.171.55.134'
通过这种方式,我成功地使它工作,但我想找出一种更通用的方法,我可以使用 .* 或 .*? 而不是 19 个点,因为有时两种模式之间有更多未知的长度数据:
tac logfile.txt|grep -aP -m1 '(?<!2016-06-03)...................86.171.55.134'
这里有 5000 行实际的日志数据可以播放:
http://www.filefactory.com/file/2sdj77aqflxp/5000.txt
只有IP地址是伪造的。
^(?<!2016-06-03).*?86.171.55.134
这个正则表达式永远不会起作用,让我们分解一下来理解:
^ # Start of line
(?<!2016-06-03) # Negative look behind searching for 2016-06-03
行开始前能有什么吗?
您可能希望尝试将其更改为展望未来:
tac logfile.txt | grep -P '^(?!2016-06-03).*?86.171.55.134'
或者使用 sed:
tac logfile.txt | sed -n '/^2016-06-03/!{/86.171.55.134/p}'
如果您只想要第一个(最后一个因为tac
)匹配:
tac logfile.txt | sed -n '/^2016-06-03/!{/86.171.55.134/{p;q}}'
这将对包含 IP 的行进行 grep,然后删除具有今天日期的行。(广义方式)并只砍掉其中的第一个。
tac data |grep "86.171.55.134" |grep -v "`date +%Y-%m-%d`" |head -1
2016-06-02 11:46:33 +0200 -> 86.171.55.134