我有一个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 的问题,因为我的日期戳分为多个字段。
答案 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
循环。