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


21

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

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

我如何才能grep获得这个文件,并且只获得从早上8点到晚上11点的行?

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

Answers:


23
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脚本检查第二列(小时)。


嗨,它的工作原理..但是你可以添加一些解释它是如何工作的吗?我没有得到这个^[^ ]+部分..
Rosdi

20

为什么要使用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


1
我认为OP需要在上午8点到晚上11点之间的所有日志,机器人只是特定日期的日志。
Dennis

1
他也可以这样做。例如:sed -n'/ 2012-3-06 11:34:48 /,/ 2012-3-06 16:34:48 / p'logfile.name
Nima G

1
讨厌的错字。我的意思是:不是特定日子的那些。
Dennis

2
这种方法的问题是日志文件中必须有一行带有该时间戳。在上面的示例中,如果没有时间戳为2012-03-06 11:34:48的行,则不会打印任何内容。上面的awk方法适用于这种情况(即你希望所有日志的小时在8到11之间,但是你不知道是否有一个日志条目在2012-03-06 08:00:00或者其他任何东西一小时)。
user650654 2014年

0

实际上有一种更简单的方法。

下载/文档: autodrgrep.kl.sh

命令:

./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是您希望扫描的日志中的日期范围

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

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

  • 5指定警告。通过指定5,如果您指定的搜索字符串至少出现5次,则告诉程序警告为WARNING

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

  • -show指定您将获得什么类型的响应。通过指定-shown,您将说明是否找到与指定模式匹配的内容,并将其输出到屏幕。

样品运行:

# ./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表示在日志中找不到您请求搜索的实际日期范围或时间范围。在这种情况下,将检测并使用指定时间的最近时间。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.