如何 grep 特定时间段内的日志文件

如何 grep 特定时间段内的日志文件

我有一个日志文件,日志中的每一行都带有日期,如下所示:

2012-03-06 11:34:48,657 blah blah blah...

我如何获取grep此文件并仅获取上午 8 点到晚上 11 点之间的行?

我的目的是计算上午 8 点到晚上 11 点之间发生的错误数量。

答案1

egrep '^[^ ]+ (0[89]|1[0-9]|2[012]):'

详细解释可以参见各种正则表达式(正则表达式)教程;egrep使用“POSIX 扩展”语法(man 7 regex)。

  • 第一个^意思是“线路的开始”。

  • [^ ]+只匹配日期字段,而不考虑实际日期。

    • [...]表示“括号之间的任意字符”,因此[89]将匹配 或89[0-9]任意数字,并且[^ ]是任意内容除了一个空格(因为^里面有括号)。

    • +意思是“一个或者更多前一个的”(例如,a+将匹配aaaaaaaaaaaa)。

    • 因此,^[^ ]+将从线的开头开始,并尽可能多地匹配非空间字符。

  • (...|...|...)表示“给定模式中的任一种”,因此(0[89]|1[0-9]|2[012])表示“要么0[89]1[0-9]要么2[012]”。它将匹配从 08 到 22 的所有数字。


一个更好的选择是:

awk -F'[: ]' '$2 >= 8 && $2 <= 22 { print }'

-F选项根据[: ]正则表达式(匹配:或空格)将每行拆分为单独的字段,并且awk脚本检查第二列(小时)。

答案2

为什么要使用 grep?您只需使用 sed 即可。

例子:

sed -n '/Jun 17 13:39:54/ , /Jun 18 10:50:28/p' kern.log

June 17 13:39:54这将打印介于和之间的所有日志June 18 10:50:28

答案3

实际上有一个更简单的方法可以做到这一点。

下载/文档: 自动删除文件

命令:

./autodrgrep.kl.sh   notchef   /tmp/client.log   '2016-05-08_08:00:00,2016-05-08_23:00:00'   'INFO'   'a2ensite'   5  10  -show

解释:

  • autodrgrep.kl.sh 是工具名称。

  • notchef 是传递给工具的一个选项,用于告诉它要做什么。在这个特定情况下,它告诉工具日志文件 /tmp/client.log 是什么类型。

  • /tmp/client.log 当然是日志文件。

  • 2016-05-08_19:12:00,2016-05-08_21:13:00 是您希望扫描的日志内的日期范围

  • “信息”是您感兴趣的日志中的字符串之一。

  • “a2ensite” 是您希望找到“INFO”字符串的同一行上的另一个字符串。指定这两个字符串(INFO 和 a2ensite)可以更快地隔离和处理您想要的行,特别是在处理大型日志文件时。

  • 5指定警告5。

  • 10 指定严重。通过指定 10,您告诉程序,如果您指定的搜索字符串至少出现 10 次,则发出严重警报。

  • - 显示您会通过指定哪种类型的响应。

示例运行:

# ./autodrgrep.kl.sh notchef  /tmp/client.log   '2016-05-08_19:12:00,2016-05-08_21:13:00' 'INFO' 'a2ensite'  5  10  -show

[2016-05-08 19:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:13:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 19:42:57-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 19:42:57-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 19:42:57-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 19:43:08-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 19:43:11-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:12:58-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:12:58-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:12:58-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:13:10-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:13:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 20:42:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 20:42:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 20:42:59-07:00] INFO: execute[a2ensite default] ran successfully
[2016-05-08 20:43:09-07:00] INFO: Processing execute[a2ensite nagios3.conf] action run (logXrayServer::install line 24)
[2016-05-08 20:43:12-07:00] INFO: execute[a2ensite default] sending restart action to service[apache2] (delayed)
[2016-05-08 21:12:59-07:00] INFO: Processing template[/usr/sbin/a2ensite] action create (apache2::default line 90)
[2016-05-08 21:12:59-07:00] INFO: Processing execute[a2ensite default] action run (apache2::default line 24)
[2016-05-08 21:12:59-07:00] INFO: execute[a2ensite default] ran successfully
23
2---78720---23---ATWFILF---(2016-05-08)-(19:12)---(2016-05-08)-(21:13) SEAGM

如果用户指定的日期范围或时间范围不在日志中怎么办?

每次运行上述命令时总会有一行(输出的最后一行)显示“ATWFILF”或“ETWNFILF”。

  • ATWFILF 表示在日志中找到了您请求搜索的实际日期范围或时间范围。所以这很好。

  • ETWNFILF表示您要求搜索的实际日期范围或日志中未找到的时间范围,在这种情况下,最接近您指定的时间的时间将被检测到并使用。

相关内容