从日志文件中提取最后 5 分钟的信息

从日志文件中提取最后 5 分钟的信息

我的系统日期格式:

Thu Jun 13 12:55:18 EDT 2019

我的日志格式:

193.118.26.141 - - [01/May/2019:00:08:49 -0400] "GET / HTTP/1.1" 200 27

有人可以帮我,如何获取最后 5 分钟的日志吗?

答案1

由于您需要大量的文本处理和时间操作,因此应该使用 来完成awk,但仍然需要外部date命令才能工作。

以下awk程序(我们称之为parse_log_range.awk)将起作用:

#!/bin/awk -f
BEGIN{
    "date +%s" | getline now
    close("date +%s")
}

{
    n=match($0,/\[[^]]+\]/)
    tst=substr($0,n+1,RLENGTH-2)

    gsub(/\//," ",tst)  # replace all '/'
    sub(/:/," ",tst)    # replace first ':'
    
    cmd="date +%s -d \"" tst "\""
    cmd | getline tst_s; close(cmd)

    if (now-tst_s<max_age) print
}

一开始,它将date +%s在 shell 中启动命令来查询当前时间并将其存储在变量中now

对于日志文件的每一行,这将

  • 提取时间戳作为中间的元素[ ... ]
  • 删除/和 第一个:以使格式易于理解date
  • 创建一个 shell 命令,该命令会将时间戳转换为“自纪元以来的秒数”date +%s -d edited timestamp
  • 在 shell 中运行此命令,并将结果读入变量tst_s

然后,它将检查时间戳是否小于max_age远离now,其中max_age是您必须指定的时间跨度(在您的示例中,5 分钟 = 300 秒)。

运行命令为

awk -v max_age=300 -f parse_log_range.awk logfile.txt

相关内容