我正在尝试根据以下内容过滤日志文件:
错误的日期范围 (yyyy-mm-dd)
错误的时间戳范围 (01:00:00 - 00:00:00)
关键字(previousFireTime、nextFireTime)
我一直在尝试grep
日志文件,但是,我无法使用grep
.我是否必须使用awk
andgrep
或awk
and的组合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()