Grep out一个文本文件的最后一个匹配行,该行包含给定的字符串,并且不以另一个字符串

时间:2016-06-03 10:24:44

标签: bash perl logging grep pcre

我想分析日志文件,并为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地址被伪造。

2 个答案:

答案 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