在日志中查找日期范围内的grep

7

我正在尝试使用grep命令查找两个日期范围内的所有行,日期格式如下: date_time.strftime("%Y%m%d%H%M") 比如在[201211150821 - 201211150824]之间的行。

我正在编写一个脚本,需要查找这些日期之间的行:

cat <somepattern>*.log | **grep [201211150821 -  201211150824]** 

我想知道在Unix中是否存在一种方法可以查找日期范围。

我可以将日志中的日期转换为(自时代)并使用常规grep和[time1-time2],但这意味着读取每行,提取时间值,然后进行转换等。

也许已经存在一些简单的方法,使我可以像向grep提供数字范围一样指定日期/时间戳范围?

谢谢!

P.S: 另外,我可以传递类似于2012111511(27|28|29 | [3-5] [0-9])的模式,但那是我想要的特定范围,并且每次尝试不同日期都很乏味,在运行时更加棘手。


最简单的方法是使用 gawk 将日期解析为纪元时间,然后在 gawk 中进行过滤。 - Tomasz Nurkiewicz
1
正则表达式没有数值范围的概念,只有字符。如果您不想每次都创建特定的正则表达式,grep 不是正确的工具。 - Tomalak
5个回答

2
使用awk命令。假设行中的第一个标记是时间戳:
awk '
BEGIN { first=ARGV[1]; last=ARGV[2]; }
$1 > first && $1 < last { print; }
' 201211150821 201211150824

2
一个Perl解决方案:
perl -wne 'print if m/(?<!\d)(20\d{8})(?!\d)/
                      && $1 >= 201211150821 && $1 <= 201211150824'

它会找到以数字“20”开头的第一个十位整数,如果该整数在您关注范围内,则打印该行。如果它没有找到这样的整数,则跳过该行。您可以调整正则表达式,使其更严格地限制有效月份、小时等。

1
您正在寻找有些晦涩的“csplit”(上下文分割)命令:
csplit '%201211150821%' '/201211150824/' file 将从文件中拆分出第一个和第二个正则表达式之间的所有行。如果您的文件按日期排序(您说您正在搜索日志),那么这可能是最快且最短的方法。

0

Bash + coreutils的expr:

export cmp=201211150823 ; cat file.txt|while read line; do range=$(expr match "$line" '.*\[\(.*\)\].*'); [ "x$range" = "x" ] && continue; start=${range:0:12}; end=${range:15:12}; [ $start -le $cmp -a $end -ge $cmp ] && echo "match: $line"; done

cmp是您的比较值,


0

我为类似搜索编写了一个特定的工具 - http://code.google.com/p/bsearch/

在您的示例中,使用方法如下:

$ bsearch -p '$[YYYYMMDDhhmm]' -t 201211150821 -t 201211150824 logfile.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接