如何获取最近 5 分钟内写入文件的日志行?

如何获取最近 5 分钟内写入文件的日志行?

我有一个如下所示的日志文件,该日志是连续记录的:

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

使用 GNUdateawk,您可以执行以下操作:

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

这些假设日志条目按时间顺序排列。情况并非总是如此,例如时间戳指的是操作的开始,但日志条目添加在操作的末尾,并且某些服务器软件同时执行多个操作。

相关内容