7

我正在尝试 grep 2 个日期范围之间的所有行,其中日期的格式如下: date_time.strftime("%Y%m%d%H%M") 所以说在 [201211150821 - 201211150824] 之间

我正在尝试编写一个脚本,其中涉及查找这些日期之间的行:

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

我试图找出 unix 中是否存在某些东西,我可以在其中查找日期范围。

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

可能已经存在一些简单的东西,所以我可以指定日期/时间戳范围,就像我可以向 grep 提供数字范围一样?

谢谢!

PS:我也可以传入类似 2012111511(27|28|29|[3-5][0-9]) 的模式,但这特定于我想要的范围,并且每次尝试不同的日期和在运行时执行此操作变得更加棘手。

4

5 回答 5

2

Perl 解决方案:

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

(它找到以 开头的第一个十位整数,20如果该整数在您感兴趣的范围内,则打印该行。如果它没有找到任何这样的整数,它会跳过该行。您可以将正则表达式调整为更多限制有效月份和时间等。)

于 2012-11-21T20:09:32.817 回答
2

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

awk '
BEGIN { first=ARGV[1]; last=ARGV[2]; }
$1 > first && $1 < last { print; }
' 201211150821 201211150824
于 2012-11-21T20:02:40.447 回答
1

您正在寻找有点晦涩的“csplit”(上下文拆分)命令:

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

将从文件中拆分出第一个和第二个正则表达式之间的所有行。如果您的文件按日期排序(您说您正在查找日志),这可能是最快和最短的。

于 2012-11-21T20:30:20.230 回答
0

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

在您的示例中,用法将是:

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

于 2013-04-21T16:32:58.887 回答
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是你的比较值,

于 2012-11-21T20:37:31.573 回答