2016-03-08 71 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操縱文字。 –