在日志的日期范围之间的grep(grep between date ranges in a log)

2019-07-04 01:03发布

我想到grep 2日期范围,其中所述日期的格式这样之间的所有行:( “%Y%米%d%H%M”)date_time.strftime所以之间说[201211150821 - 201211150824]

我想写这涉及到寻找这些日期之间行的脚本:

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

我试图找出是否在UNIX,我可以寻找在日期范围存在的东西。

我可以在日志转换日期,以(自历元),然后使用与普通的grep [TIME1 - 时间2],但是这意味着读每一行,在提取时间值,然后将其转换等。

可能是一些简单的存在,让我可以指定日期/时间标记的范围,我可以提供一个数字范围到grep的方式吗?

谢谢!

PS:我也可以在图案像2012111511(| 28 | 29 | 27 [3-5] [0-9])传球,但多数民众赞成具体到我想要的范围及其繁琐的每次尝试不同的日期和总是存在意外在运行时这样做。

Answer 1:

用awk。 假设在该行的第一个标记是时间戳:

awk '
BEGIN { first=ARGV[1]; last=ARGV[2]; }
$1 > first && $1 < last { print; }
' 201211150821 201211150824


Answer 2:

一个Perl的解决方案:

perl -wne 'print if m/(?<!\d)(20\d{8})(?!\d)/
                      && $1 >= 201211150821 && $1 <= 201211150824'

(它找到的第一个十位数的整数,开头20 ,并打印如果该整数是你感兴趣的范围内就行了。如果没有发现任何这样的整数,它跳过就行了。你可以调整正则表达式是更严格的关于有效个月,小时等)。



Answer 3:

您正在寻找的有些模糊的“csplit可”(背景分割)命令:

csplit可 '%201211150821%' '/ 201211150824 /' 文件

将从文件分割了所有的第一和第二正则表达式之间的界线。 这很可能是最快,最短,如果你的文件上的日期排序(你说你grepping日志)。



Answer 4:

击+的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是你的比较值,



Answer 5:

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

在你的榜样,用法将是:

$ bsearch -p '$ [为yyyymmddhhmm]' -t 201211150821 -t 201211150824日志文件。



文章来源: grep between date ranges in a log