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



我想分析一个日志文件,并搜索一个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

相关内容

  • 没有找到相关文章

最新更新