我有一个日志文件,日志中的每一行都带有日期,如下所示:
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]
将匹配 或8
;9
是[0-9]
任意数字,并且[^ ]
是任意内容除了一个空格(因为^
里面有括号)。+
意思是“一个或者更多前一个的”(例如,a+
将匹配a
、aaa
和aaaaaaaa
)。因此,
^[^ ]+
将从线的开头开始,并尽可能多地匹配非空间字符。
(...|...|...)
表示“给定模式中的任一种”,因此(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表示您要求搜索的实际日期范围或日志中未找到的时间范围,在这种情况下,最接近您指定的时间的时间将被检测到并使用。