關於你的問題我已經創建了虛擬日誌,還要注意時間與我的時區密切相關。在運行腳本之前,我還顯示了當前時間。是
$ 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
謝謝,它很好用,你能解釋一下「while read ...」這行嗎? – wakinov
它逐行讀取文件,使用'read' shell builtin,'help read'獲取更多信息。簡而言之,它會將每行文件讀入一個名爲'line'的變量(成功讀取返回0退出代碼),或者使用'[[-n line]]'檢查'line'變量的長度是否不爲0(這是需要的當行不結束換行符char('\ n'),例如:最後一行) – ritesht93