要在具有自定义日期格式的文件中查找日期范围内的行

时间:2018-02-01 22:03:04

标签: linux bash date awk

我试图查找文件中日期范围之间的所有行。但是日期是以非标准方式格式化的。有没有办法让awk阅读这些内容?日志文件的格式如下:

Jan  5 11:34:00 log messages here
Jan 13 16:21:00 log messages here
Feb  1 01:14:00 log messages here
Feb 10 16:32:00 more messages
Mar  7 16:32:00 more messages
Apr 21 16:32:00 more messages

例如,如果我想在1月1日到2月10日之间拉出所有行: 我试过了:

awk 'BEGIN{IGNORECASE=1} ($0>=from&&$0<=to)' from="Jan  1 00:00:00" to="Feb 10 23:59:59"

这是一个只能访问awk的系统,所以我有点受限。任何帮助将不胜感激。

编辑: 非常感谢到目前为止的答案!他们工作得很好,帮助了解AWK。但是我确实忘了提到我需要能够包括时间。

例如,查找范围包括和之间的行:

Jan 1 12:34:00

Feb 20 14:23:01

EDIT2:根据@Cyrus提供的答案,我决定用它来解析时间:

awk -v start="0101 10:23:22" -v stop="0210 14:21:02" \ 'BEGIN{m["Jan"]="01"; m["Feb"]="02"; m["Mar"]="03"; m["Apr"]="04"} {original = $0; $1 = m[$1]; $2 = sprintf("%.2d", $2)} $1$2$3 >= start && $1$2$3 <= stop {print original}' file

2 个答案:

答案 0 :(得分:2)

$ cat tst.awk
{
    mthNr = (index("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3
    date  = sprintf("%02d%02d", mthNr, $2)
}
(date >= from) && (date <= to)

$ awk -v from='0101' -v to='0210' -f tst.awk file
Jan  5 11:34:00 log messages here
Jan 13 16:21:00 log messages here
Feb  1 01:14:00 log messages here
Feb 10 16:32:00 more messages

按摩以适应...

答案 1 :(得分:1)

用awk。 0101是1月1日,0210是2月10日。

awk -v start="0101" -v stop="0210" \
    'BEGIN{m["Jan"]="01"; m["Feb"]="02"; m["Mar"]="03"; m["Apr"]="04"}
    {original = $0; $1 = m[$1]; $2 = sprintf("%.2d", $2)}
    $1$2 >= start && $1$2 <= stop {print original}' file

输出:

Jan  5 11:34:00 log messages here
Jan 13 16:21:00 log messages here
Feb  1 01:14:00 log messages here
Feb 10 16:32:00 more messages