2010-08-24 67 views
1

我需要使用shell腳本(bash)從日誌文件中提取一些信息。從日誌文件中的線一般是這樣的:使用Bash從日誌文件中選擇時間間隔

2009-10-02 15:41:13,796| some information 

有時,這樣的行後跟幾行提供有關事件的詳細信息。這些額外的行沒有特定的格式(特別是它們不以時間戳開始)。

我知道如何使用grep根據關鍵字和表達式過濾文件。基本上我遇到的麻煩是有時我只需要看特定的時間間隔。例如,我只需要看看最近X分鐘發生的事件。我對shell腳本沒有經驗,但由於時間格式的複雜性,這對我來說似乎是一項相當困難的任務。另一方面,我可以想象這不是很不尋常,所以我想知道是否有一些工具可以讓我更容易,或者如果你能給我一些關於如何解決這個問題的提示?

+0

感謝您的所有答案。不幸的是,很多東西在服務器上都不支持(沒有帶%s參數的日期,沒有phython,systime()也不行)。我決定現在使用Perl,因爲它提供了一些缺少的方便的時間函數。儘管如此,你的評論給了我很多有用的提示! – bufferUnderrun 2010-08-25 14:26:15

回答

1
gawk -F"[-: ]" 'BEGIN{ 
    fivemin = 60 * 60 * 5 #last 5 min 
    now=systime() 
    difference=now - fivemin 
} 
/^20/{ 
    yr=$1 
    mth=$2 
    day=$3 
    hr=$4 
    min=$5 
    sec=$5 
    t1=mktime(yr" "mth" "day" "hr" "min" "sec) 
    if (t1 >= difference) { 
    print 
    } 
}' file 
+0

@ ghostdog74:這似乎無法處理OP在其日誌文件中的額外信息行。不過,我喜歡它。 – 2010-08-24 12:50:01

0

您可能想看看my Python program,它根據一段時間從日誌文件中提取數據。日期的規範尚未實現(它的目的是大致看最近的24小時)。它期望的時間格式(例如Jan 14 04:10:13)看起來與你想要的有些不同,但可以改編。我沒有用非時間戳線測試它,但它應該在指定的時間範圍內打印所有內容。

這會給你一些使用信息:

timegrep.py --help 
1

基本上我遇到的麻煩的是,有時我需要看看 只在特定的時間間隔。

你可以使用date的日期簽名轉換爲你與%s參數:

%s  seconds since 1970-01-01 00:00:00 UTC 

有了它,我們可以做一個小的演示:

#!/bin/bash 

timespan_seconds=300 # 5 minutes 

time_specified=$(date +"%s" -d "2010-08-25 14:54:40") 

let time_now=$(date +"%s") 
let time_diff=($time_now - $timespan_seconds) 

if [ $time_specified -ge $time_diff ]; then 
     echo "Time is within range" 
fi 

注意,這並未不會處理未來的時間。