阅读日志文件并获取两个日期之间的条目

时间:2017-08-23 13:49:13

标签: linux bash grep

我想从访问日志文件中提取一些与关键字匹配的信息以及两个日期之间的信息。对于前者我想在包含文本“passwd”的两个日期之间找到日志条目。目前,我使用以下命令但没有得到正确的结果:

fgrep "passwd" * | awk '$4 >= "[20/Aug/2017" && $4 <= "[22/Aug/2017"'

日期格式为[22 / Feb / 2017:17:28:42 +0000]。

我已经搜索并查看了这篇文章extract data from log file in specified range of time但不完全明白如何使用它。

编辑:

Following are the example entries of the access log files,
xxx-access_log:xx.xx.xx.xx - - [22/Feb/2017:17:30:02 +0000] "GET /cms/usr/extensions/get_tree.inc.php?GLOBALS[root_path]=/etc/passwd%00 HTTP/1.1" 404 39798
xxx-access_log:xx.xx.xx.xx - - [22/Feb/2017:17:31:12 +0000] "GET /cgi-bin/libs/smarty_ajax/index.php?_=&f=update_intro&page=../../../../../../../../../../../../../../../../../../etc/passwd%00 HTTP/1.1" 404 30083
xxx-access_log:xx.xx.xx.xx - - [22/Feb/2017:17:31:19 +0000] "GET /download/libs/smarty_ajax/index.php?_=&f=update_intro&page=../../../../../../../../../../../../../../../../../../etc/passwd%00 HTTP/1.1" 404 27982
xxx-access_log:xx.xx.xx.xx - - [22/Feb/2017:17:31:24 +0000] "GET /sites/libs/smarty_ajax/index.php?_=&f=update_intro&page=../../../../../../../../../../../../../../../../../../etc/passwd%00 HTTP/1.1" 404 35256
xxx-access_log:xx.xx.xx.xx - - [22/Feb/2017:17:28:32 +0000] "GET /modx/manager/media/browser/mcpuk/connectors/php/Commands/Thumbnail.php?base_path=/etc/passwd%00 HTTP/1.1" 404 6956
xxx-access_log:xx.xx.xx.xx - - [22/Feb/2017:17:28:42 +0000] "GET /modx/manager/media/browser/mcpuk/connectors/php/Commands/Thumbnail.php?base_path=/etc/passwd%00 HTTP/1.1" 404 6956

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

如果您知道日志文件中出现2个特定字符串,则会使用您引用的链接。该命令将搜索第一个字符串并显示所有行,直到找到第二个字符串然后停止。

在您的情况下,如果您想要通用日期操作,那么使用perl和其中一个日期/时间模块可能会更好。大多数(如果不是全部)具有内置日期比较例程,其中许多将以几乎任何可想象的格式获取日期......并且那些通常不提供指定日期格式的能力的日期

(如果你只是使用日期而不是使用时间,那么Date :: EzDate是我最喜欢的,也许是最容易学习和快速实施的。)

Shell命令可能不会很好地处理日期操作。