使用Find / Grep在特定时间之间搜索文件

时间:2012-09-04 16:14:10

标签: linux unix find grep cygwin

我可以使用以下命令搜索过去10天内的日志文件:

find . -type f -mtime -10 |xargs grep -i -n 'exception' 2> /dev/null

但我想进一步限制搜索文件中 6am 6pm 之间记录的行。我想知道如果行如下所示我可以修改grep命令来过滤这些:

2012-09-04 03:50:41,658 [MainLogger: ] EXCEPTION  AppLog - some exception 1
2012-09-04 10:01:32,902 [MainLogger: ] EXCEPTION  AppLog - some exception 2
2012-09-04 15:39:51,901 [MainLogger: ] EXCEPTION  AppLog - some exception 3
2012-09-04 18:12:51,901 [MainLogger: ] EXCEPTION  AppLog - some exception 4

在上述情况下,应该返回第2行和第3行,因为它们介于 6am 6pm 之间。

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

一种简单的丑陋方式可以添加很多greps,如下所示:

find . -type f -mtime -10 |xargs grep -i -n 'exception' | grep -v " 00" | grep -v " 01" | ... | grep -v " 18" | grep -v " 19" ... 2> /dev/null

或者更简洁:

find . -type f -mtime -10 |xargs grep -i -n 'exception' | grep -v -e " \(0[012345]\|18\|19\|2[0123]\)" 2> /dev/null

答案 1 :(得分:1)

你可以像这样破解:

grep ' 0[6789]:\| 1[01234567]\| 18:00:00,000'

但如果您需要更多时间处理,我建议您切换到更强大的语言(例如Perl和DateTime)。

答案 2 :(得分:0)

在具有正确日期时间库的任何语言中,将所有日期转换为规范表示会使问题变得微不足道。默认规范化是从1970年1月1日午夜开始转换为秒。然后只看输入行的规范数字是否大于开始时间且小于结束时间。