我有一个如下所示的日志文件,该日志是连续记录的:
2021-08-12 16:09:17 textsp sdgg
reponse:success
prams:invalid
2021-08-12 16:10:17 textdfdfdlfs sfdfs
reponse: failed
prams:valid
我想写一个脚本来获取5分钟前的日志。但我仍然不知道,线路包含响应参数,婴儿车没有时间,所以很难过滤。对于这个案例你有什么想法吗?
答案1
使用 GNUdate
和awk
,您可以执行以下操作:
START=$(date -d '5 minutes ago' +'%F %T') \
LC_ALL=C awk '
/^[0-9]{4}(-[0-9]{2}){2}/ && $0 >= ENVIRON["START"], 0
' < file.log
哪个使用awk 'start, end {action}'
对开始、结束范围内的行运行操作,但这里没有指定操作,默认打印行 0(意味着错误的) 作为结束条件,并从第一行开始,该行以看起来像时间戳且大于 5 分钟前的时间戳的内容开头。
对于两个时间戳之间的日志:
START=$(date -d '15 minutes ago' +'%F %T') \
END=$(date -d '5 minutes ago' +'%F %T') \
LC_ALL=C awk '
match($0, /^[0-9]{4}(-[0-9]{2}){2} ([0-9]{2}:){2}[0-9]{2}/) {
timestamp = substr($0, RSTART, RLENGTH)
if (timestamp > ENVIRON["END"]) exit
if (timestamp >= ENVIRON["START"])
started = 1
}
started' < file.log
这些假设日志条目按时间顺序排列。情况并非总是如此,例如时间戳指的是操作的开始,但日志条目添加在操作的末尾,并且某些服务器软件同时执行多个操作。