我正在尝试通过脚本获取最后五分钟的日志

我正在尝试通过脚本获取最后五分钟的日志

我有一个将连续附加的输出日志文件,并且我计划有一个脚本(每 5 分钟运行一次)来从输出日志中检索最后 5 分钟的数据。

输出日志文件中的示例数据:

2015-10-29 09:19:39,630 INFO line1 of log  
2015-10-29 09:21:39,630 INFO line2 of log
2015-10-29 09:22:39,630 INFO line3 of log
2015-10-29 09:23:39,630 INFO line4 of log
2015-10-29 09:24:39,630 INFO line5 of log
2015-10-29 09:25:39,630 INFO line6 of log

如果我在 09:25 运行脚本,它应该捕获最后 5 行并发送到单独的输出文件。

答案1

这就是您所需要的:

five_min=$( date -d "5 minutes ago" +"%F %T" )
while IFS= read -r line; do
    [[ "$five_min" < "$line" ]] && echo "$line"
done < output.log

所以,这是一个巨大的文件。然后使用tac先从底部输出文件:

five_min=$( date -d "5 minutes ago" +"%F %T" )
tac output.log | while IFS= read -r line; do
    [[ "$five_min" < "$line" ]] && echo "$line"
done | tac

while命令与其他语言一样,在条件为真时执行其主体。在 POSIX shell 中, ifand命令的“条件”while本身就是一个命令。 “条件”的“真相”是命令以零退出状态退出。非常重要的是要认识到单词[and[[实际上是命令,而不仅仅是语法(来自 bash shell 类型help [[and help [

在此答案中,条件是IFS= read -r line这是从文件中读取行并保持所有空白和反斜杠序列完整的规范方法。read如果没有更多内容可以从输入流中读取,则将以非零退出状态返回。在我的第一个响应中,我将日志文件的内容重定向到命令的标准输入while,并将read读取该数据。

答案2

#!/bin/bash
#To get previous 5 minutes logs from now(IST)
d1=$(date –date="-5 min" +'%Y-%m-%d %H:%M:%S.%3N')
d2=$(date +'%Y-%m-%d %H:%M:%S.%3N') #Added missing closing parenthesis

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' /var/log/<file_name >  > /var/log/$<new_file_name>

相关内容