【问题标题】:Awk to find lines within date range in a file with custom date formatawk 在具有自定义日期格式的文件中查找日期范围内的行
【发布时间】:2018-07-12 08:28:37
【问题描述】:

我正在尝试查找文件中日期范围之间的所有行。但是,日期以非标准方式格式化。有没有办法让 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

【问题讨论】:

  • 如果将月份名称标准化为数字,则可以进行直接的字典比较。

标签: linux bash date awk


【解决方案1】:
$ 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

按摩适合...

【讨论】:

  • 这也很好用,但我忘了说我还需要能够指定时间范围
  • 不明显和琐碎的时间怎么加?
  • 好吧,我确实尝试过这种方法,但没有奏效。 { mthNr = (index("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3 date = sprintf("%02d%02d %s", mthNr, $2,$3) } (date &gt;= from) &amp;&amp; (date &lt;= to) $ awk -v from='0101 10:23:00' -v to='0210 16:23:22' -f tst.awk file 我不断在“to”变量的第一个冒号上收到语法错误。对不起,这对我来说并不明显,因为我是 awk 的新手,并且已经在这方面花了很多时间。
  • 希望您复制/粘贴确切的语法错误,因为您写的内容是正确的,我可以从评论中看出,所以我无法想象语法错误可能是什么。
  • 等一下 - 你不包括 $ 在行的开头 $ awk ... 是吗? $ 只是我的提示。
【解决方案2】:

使用 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

输出:

1 月 5 日 11:34:00 在此处记录消息 1 月 13 日 16:21:00 在此处记录消息 2 月 1 日 01:14:00 在此处记录消息 2月10日 16:32:00 更多消息

【讨论】:

  • 将其修改为使用时间:awk -v start="0101 10:24:23" -v stop="0210 15:23:22" \ '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 &gt;= start &amp;&amp; $1$2$3 &lt;= stop {print original}' file 感谢您的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2020-03-19
  • 2016-09-22
  • 2016-10-08
相关资源
最近更新 更多