2016-03-08 76 views
0

我有cron作业使用的条目如何从BASH中的日志文件中准确获取过去一小时内的日志?

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

我希望能够以格式定期检查日志,看是否有特定的计划任务(运行hoursly)跑的日志文件。通过grep查找我想要的日志很容易。

grep name_of_job logfile 

但我不确定如何准确地抓住仅从过去一小时日志,看是否有cron作业已经跑了。

我尝试使用AWK命令抢到最后一小时based on this post而是因为我的邮戳被分为多个字段我有问题与AWK

回答

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

+0

谢谢,它很好用,你能解释一下“while read ...”这行吗? – wakinov

+0

它逐行读取文件,使用'read' shell builtin,'help read'获取更多信息。简而言之,它会将每行文件读入一个名为'line'的变量(成功读取返回0退出代码),或者使用'[[-n line]]'检查'line'变量的长度是否不为0(这是需要的当行不结束换行符char('\ n'),例如:最后一行) – ritesht93

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 

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

+0

谢谢我已经实现了其他人,因为它工作,他首先发布,但我喜欢你的答案,并像你用小窍门长月字符串:)。 – wakinov

+0

谢谢。在尝试使用shell循环之前,您可能需要阅读http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice操纵文字。 –