2012-06-21 10:54:47 +0000 2012-06-21 10:54:47 +0000
22
22
Advertisement

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

Advertisement

我有一个日志文件,日志中的每一行都有一个日期,就像这样。

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

我怎么才能grep这个文件 只得到从早上8点到晚上11点的行?

我的目的是想统计从早上8点到晚上11点的错误数量。

Advertisement
Advertisement

答案 (3)

24
24
24
2012-06-21 11:08:20 +0000
egrep '^[^]+ (0[89]|1[0-9]|2[012]):'

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

  • 第一个^的意思是 "行的开始"。

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

  • (...|...|...) 意味着 "给定模式中的任何一种",所以(0[89]|1[0-9]|2[012]) 意味着 ”0[89]1[0-9]2[012]“。


一个更好的选项是:

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

-F选项根据[:] regex将每一行分割成独立的字段(匹配:或空格),awk脚本检查第2列(小时)。

21
21
21
2012-06-21 11:11:02 +0000

为什么要使用grep?你可以简单地使用 sed。

例如:

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

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

0
Advertisement
0
0
2016-05-09 06:43:49 +0000
Advertisement

其实还有一个更简单的方法。

下载/文档。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指定Warning。

  • 5 表示警告。指定 5,就是告诉程序,如果你指定的搜索字符串至少有 5 次出现,就会以警告的形式发出警告。通过指定10,你告诉程序,如果你指定的搜索字符串至少出现10次,就会以 "关键 "警告。

-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 意味着您要求搜索的实际日期范围或时间框架没有在日志中找到。在这种情况下,将检测并使用与您指定的时间最接近的时间。

Advertisement
Advertisement