我的系统日期格式:
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