2015-05-01 51 views
2

我想在以下日誌中獲取「Ap​​r 24 10:00:00.000000」和「Apr 25 24:00:00.999999」之間的數據,但我不確定如何獲取這項工作:在bash中按日期和時間過濾

files/file1:Apr 22 02:47:00.663117 somedata 
files/file1:Apr 23 04:47:00.663127 somedata 
files/file1:Apr 24 05:47:00.663137 somedata 
files/file1:Apr 24 10:47:00.663137 somedata 
files/file1:Apr 25 01:47:00.663147 somedata 
files/file1:Apr 25 23:47:00.663157 somedata 
files/file1:Apr 25 23:47:00.663167 somedata 
files/file1:Apr 26 23:47:00.663177 somedata 

我嘗試使用下面的命令,但那樣只會被時間過濾和不考慮日期,以及:

awk -v start=10:00:00.000000 -v stop=24:00:00.999999 'start <= $3 && $3 <= stop' 

我想只有以下數據是牽強:

files/file1:Apr 24 10:47:00.663137 somedata 
files/file1:Apr 25 01:47:00.663147 somedata 
files/file1:Apr 25 23:47:00.663157 somedata 
files/file1:Apr 25 23:47:00.663167 somedata 

有人可以幫忙嗎?

回答

1
$ cat get_dates.awk 
BEGIN { 
    start_t = mktime("2015 04 24 10 0 0") 
    end_t = mktime("2015 04 26 0 0 0") 
    FS="[:. ]" 
    for (i = 1; i <= 12; i++) { 
     timestamp = mktime("2015 " i " 1 0 0 0") 
     m = strftime("%b", timestamp) 
     month[m] = i 
    } 
} 

{ 
    now = mktime("2015 " month[$2] " " $3 " " $4 " " $5 " " $6) 
    if (start_t <= now && now <= end_t) {print} 
} 

在第一塊中,我們創建時間戳爲開始和的時間看在端部,並且我們設置字段分隔符結腸,空間,或點。然後我們創建一個數組,將縮寫月份轉換爲數字。

然後,對於每一行,我們都會創建一個帶有相應字段的新時間戳,如果它落在上面兩個時間戳之間,我們就使用它。

$ awk -f get_dates.awk dates.txt 
files/file1:Apr 24 10:47:00.663137 somedata 
files/file1:Apr 25 01:47:00.663147 somedata 
files/file1:Apr 25 23:47:00.663157 somedata 
files/file1:Apr 25 23:47:00.663167 somedata 
+0

不錯的答案。只是想補充一點,如果每個表達式都在一個新行上,那麼不需要';'在'awk'中分隔表達式。表達式分隔符是'[; \ n]' – hek2mgl

+0

要正確:它是'[; \ n] +':) – hek2mgl

+1

你每天都會學到新的東西;) – chw21