如何从BASH中的日志文件准确获取过去一小时的日志?

时间:2016-03-08 23:47:55

标签: linux bash unix awk

我有一个cron作业的日志文件,其中包含使用

格式的条目
Mar  8 17:30:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)

我希望能够定期检查日志,看看是否运行了特定的CRON作业(每小时运行一次)。通过grep查找我想要的日志很简单。

grep name_of_job logfile

但我不确定如何准确地只从过去一小时中获取日志,看看是否有任何cron作业已经运行。

我尝试使用 awk 命令获取最后一小时based on this post,但我遇到了 awk 的问题,因为我的日期戳分为多个字段。

2 个答案:

答案 0 :(得分:2)

你可以在GNU awk中执行此操作:

$ cat tst.awk
BEGIN {
    FS="[ :]+"
    nowSecs  = systime()
    thisYear = strftime("%Y")
}
{
    mthNr = (match("JanFebMarAprMayJunJulAugSepOctNovDec",$1)+2)/3
    inSecs = mktime(thisYear" "mthNr" "$2" "$3" "$4" "$5)
}
(nowSecs - inSecs) <= 60
$ awk -f tst.awk file

如果您的输入文件和当前日期可以跨越年份边界,那么您需要添加一些逻辑来处理它,因为您的输入文件不包含一年。

答案 1 :(得分:0)

你的问题我创建了虚拟日志,还要注意时间与我的时区相符。我还在运行脚本之前显示了当前时间。

$ cat file2
Mar  9 05:20:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar  9 04:20:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar  9 05:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar  5 05:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar  9 04:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
$ date
Wed Mar  9 05:40:10 IST 2016
$ ./script.bash 
Mar  9 05:20:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
Mar  9 05:35:01 hostname CROND[PROC_#]: (user) CMD (/path/to/job/)
$

script.bash的内容如下:

#!/bin/bash

while read -r line || [[ -n "$line" ]]
do
    log_date_str="$(awk '{print $1" "$2" "$3}' <<< "$line")"
    log_date="$(date -d "$log_date_str" +%s)"
    [[ $(($(date +%s)-$log_date)) -le 3600 ]] && echo "$line"
done < "file2"

我们从日志文件中获取日期并将其转换为自Unix Epoch以来经过的秒数,并从命令date +%s获取当前日期时间的相同格式注意+%s是格式这里。 date -d dateString +%s可用于将字符串解析为所需格式的日期。

一旦我们得到两个日期,我们只需减去它,然后找出那些差异小于3600秒(1小时)的结果;然后我们打印出日志行。

您可以传递while

的输出,而不是将文件名传递到grep循环。