我想分析日志文件,并为IP地址进行grepping。日志文件如下所示:
<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地址被伪造。
答案 0 :(得分:1)
^(?<!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}}'
答案 1 :(得分:0)
这将grep其中包含IP的行,然后删除具有今天日期的行。 (一般化的方式)并且只去砍掉它的第一个。
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