我正在尝试grep两个日期范围之间的所有行,其中日期的格式如下: date_time.strftime( “%Y%米%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])的模式,但是那些特定于我想要的范围以及每次尝试不同日期并且变得棘手的繁琐在运行时这样做。
答案 0 :(得分:2)
使用awk。假设行中的第一个标记是时间戳:
awk '
BEGIN { first=ARGV[1]; last=ARGV[2]; }
$1 > first && $1 < last { print; }
' 201211150821 201211150824
答案 1 :(得分:2)
Perl解决方案:
perl -wne 'print if m/(?<!\d)(20\d{8})(?!\d)/
&& $1 >= 201211150821 && $1 <= 201211150824'
(它找到以20
开头的第一个十位整数,如果该整数在您感兴趣的范围内,则打印该行。如果找不到任何这样的整数,则跳过该行。您可以调整正则表达式,使其在有效的月份和小时等方面更具限制性。等等。
答案 2 :(得分:1)
您正在寻找有点模糊的'csplit'(上下文拆分)命令:
csplit'%201211150821%''/ 201211150824 /'file
将从文件中拆分第一个和第二个正则表达式之间的所有行。如果您的文件按日期排序(您说您正在查看日志),它可能是最快和最短的。
答案 3 :(得分:0)
仅限Bash + coreutils'exp:
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
是您的比较值,
答案 4 :(得分:0)
我为类似搜索编写了一个特定工具 - http://code.google.com/p/bsearch/
在您的示例中,用法将是:
$ bsearch -p'$ [YYYYMMDDhhmm]'-t 201211150821 -t 201211150824 logfile。