GREP 可以根据关键字、日期、时间戳过滤日志文件吗?或者有更好的选择吗?

GREP 可以根据关键字、日期、时间戳过滤日志文件吗?或者有更好的选择吗?

我正在尝试根据以下内容过滤日志文件:

错误的日期范围 (yyyy-mm-dd)

错误的时间戳范围 (01:00:00 - 00:00:00)

关键字(previousFireTime、nextFireTime)

我一直在尝试grep日志文件,但是,我无法使用grep.我是否必须使用awkandgrepawkand的组合sed来获取我需要的信息?或者是否有更好更有效的途径来过滤日志文件?

编辑:示例日志输出

2018-06-06 10:46:43,708 INFO [stdout] (AsyncAppender-Worker-STDOUT) INFO 
[erFactoryBean_Worker-9] [c.c.c.s.i.d.ResendJob] Executing Quartz scheduled 
job: JobExecutionContext: trigger: 'ResendJob.trigger_ResendJob job: 
DEFAULT.ResendJob fireTime: 'Wed Jun 06 10:46:43 UTC 2018 scheduledFireTime: 
Wed Jun 06 10:46:43 UTC 2018 previousFireTime: 'Wed Jun 06 10:45:43 UTC 2018 
nextFireTime: Wed Jun 06 10:47:43 UTC 2018 isRecovering: false refireCount: 0

答案1

awk可能就是您所需要的,因为它可以进行正则表达式匹配、将行拆分为字段并进行字符串比较(只要您使用 YYYY-MM-DD HH:MM:SS 时间戳并且没有 DST 更改,它就适用于日期比较)。

如果日期在第一个字段中,时间在第二个字段中:

awk -v date=1 -v time=2 '
  $date > "2018-05-24" && $time < "12:00:00" && /some text/'

GNU awk 实现awk具有日期解析和格式化扩展,可让您执行更高级的操作,例如:

gawk -v date=1 -v time=2 '
  function parse_time(t) {
    gsub(/[:-]/, " ", t)
    return mktime(t)
  }
  BEGIN {
    start = parse_time("2018-01-01 08:00")
    end = systime() - 86400 # yesterday, same time
  }
  {t = parse_time($date" "$time)}
  t >= start && t <= end && /some test/'

答案2

grep 过滤正则表达式。它非常擅长过滤包含一个特定关键字的行,但很难使用正则表达式指定日期范围。例如,要获取 1 月 1 日 20:00 和 1 月 3 日 2:00 之间的错误,您必须接受 1 月 2 日的所有时间,但仅接受 1 月 1 日的晚上和 1 月 3 日的清晨。例如,您无法将一天中的时间和日期分开。

使用可以本地比较日期的更具表现力的工具要简单得多。 Perl 是执行此类操作的流行语言,而 Python 是一个不错的选择。

下面是一个 Python 示例:

import re
import time

f = open('/var/log/syslog')
line = f.readline()
while line:
    # Get the date at the beginning of line with a regex
    m = re.match(r'^([^\s]+\s+[^\s]+\s+[^\s]+)\s+', line)
    # Parse the date
    date = time.strptime(m.group(1), '%b %d %H:%M:%S')
    # Compare with a given date
    if date > time.strptime('Jun 6 14:00:00', '%b %d %H:%M:%S'):
        print(line, end='')

    # Read next line
    line = f.readline()

相关内容