【问题标题】:Regex to match logfile custom date formats正则表达式匹配日志文件自定义日期格式
【发布时间】:2018-02-12 16:41:59
【问题描述】:

我正在尝试解析文件中日期范围之间的行。但是,日期以非标准方式格式化。正则表达式是否可以匹配这些?日志文件的格式如下:

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 日之间的行,我无法让正则表达式匹配月份顺序,因为它们不是数字。

【问题讨论】:

标签: regex linux shell


【解决方案1】:

下面的 shell 行可能会解决问题。假设您想查看 1 月 2 日之后的前 41 天,那么您可以这样做

echodategrep 的管道:

echo {0..41} \
  | xargs -I{} -d ' ' date -d "2018-01-02 + {} days" +"%b %e" \
  | grep -F -f - <logfile>

我相信这是最快的。这个想法是建立一组可能的日子(这是前两行),然后用grep搜索它们。

使用awk 排序的日志文件:

在处理已排序的日志文件时,您可以使用快速返回来限制自己处理唯一需要的部分。

awk -v tstart="Jan  1" -v tend="Feb 10" '
   BEGIN{ month["Jan"]=1; month["Feb"]=2; month["Mar"]=3
          month["Arp"]=4; month["May"]=5; month["Jun"]=6
          month["Jul"]=7; month["Aug"]=8; month["Sep"]=9
          month["Oct"]=10;month["Nov"]=11;month["Dec"]=12
          $0=tstart; ms=$1; ds=$2
          $0=tend  ; me=$1; de=$2
         }
  (month[$1]<month[ms])             { next }
  (month[$1]==month[ms]) && ($2<ds) { next }
  (month[$1]==month[me]) && ($2>de) { exit }
  (month[$1]>month[me])             { exit }
  1' <logfile>

带有awk 的未排序日志文件:

在处理未排序的日志文件时,您需要主动进行比较。这显然需要更多时间。

awk -v tstart="Jan  1" -v tend="Feb 10" '
   BEGIN{ month["Jan"]=1; month["Feb"]=2; month["Mar"]=3
          month["Arp"]=4; month["May"]=5; month["Jun"]=6
          month["Jul"]=7; month["Aug"]=8; month["Sep"]=9
          month["Oct"]=10;month["Nov"]=11;month["Dec"]=12
          $0=tstart; ms=$1; ds=$2
          $0=tend  ; me=$1; de=$2
         }
   (ms == me) && ($1 == ms) && (ds<=$2) && ($2<=de) { print; next }
   ($1 == ms) && (ds<=$2)                           { print; next }
   ($1 == me) && ($2<=de)                           { print; next }
   (month[ms]<month[$1]) && (month[$1]<month[me])` <logfile>

以上命令均返回:

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

注意:跨越 12 月 31 日的日期范围可能会产生虚假结果。

【讨论】:

  • @Sam,通用正则表达式是不可能的,因为它取决于范围。正则表达式也不允许数字比较。因此,对于您的简单情况,正则表达式将是 Jan +[0-9]+|Feb [0-9]|Feb 1[0-1] 每次您执行不同的范围时,您都必须建立它。 awk 速度慢的问题是由于调用了date。我相信我可以加快速度。
  • @Sam 添加了一个用于排序文件的选项,这可能是最好的解决方案。遗憾的是没有正则表达式。
  • @Sam,我找到了使用grep 的方法。这可能是您使用the_silver_searcher 的解决方案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
相关资源
最近更新 更多