2016-12-15 156 views
-3

我有一個名爲source.log有時間格式的日誌文件中獲取在Linux中最後一小時的日誌,如: -如何使用awk命令

Fri, 09 Dec 2016 05:03:29 GMT 127.0.0.1 

,我使用腳本來得到一個日誌文件記錄最後1小時。

腳本: -

awk -vDate=`date -d'now-1 hour' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' source.log > target.log 

但是這個劇本給出結果相同,如源文件。 時間格式匹配有問題,因爲它沒有給出最後一個小時的記錄。

+0

您所展示的數據爲2016美元4美元。您認爲它會是什麼? –

+0

4美元將是數據顯示的列數。 我想寫一個腳本來收集應用程序日誌文件中最後1小時的日誌。我的腳本正在收集日誌文件中的所有日誌,我只需要最後1小時的日誌。 **應用程序日誌文件的示例: - ** Wed,07 Dec 2016 06:44:35 GMT connect deprecated methodOverride:use method-override – Megha

+0

嗯,我建議您更改打印以顯示日期和$ 4。你最好用某種東西「束縛」它們,否則你會覺得不同。即使您認爲是真實的,「數據顯示的列數」會如何超過您在Date中建立的數據將如何幫助您? –

回答

0

我知道我遲到了,以幫助OP,但也許這個答案可以幫助其他任何人在這種情況下。

首先有必要比較整個日期,而不僅僅是時間部分,因爲時間接近午夜。

請注意,awk只能比較字符串和數字。一些awk實現具有mktime()函數,該函數將特定格式的字符串轉換爲UNIX timestamp,以便進行日期時間比較,但它不支持任何日期時間格式,因此我們無法使用它。

最好的方法是使用'YYMMDDhhmmss' datetime格式或ISO format更改(如果可能)日誌條目的日期時間格式。以這種方式,比較兩個日期時間比較字符串或數字很簡單。

但是讓我們假設,我們不能改變日誌條目的日期格式,所以我們需要自己轉換內部awk

awk -vDate="`date -d'now-1 hour' +'%Y%m%d%H%M%S'`" ' 
    BEGIN{ 
     for(i=0; i<12; i++) 
      MON[substr("JanFebMarAprMayJunJulAugSepOctNovDec", i*3+1, 3)] = sprintf("%02d", i+1); 
    } 
    toDate() > Date 
    function toDate(){ 
     time = $5; gsub(/:/, "", time); 
     return $4 MON[$3] $2 time; 
    }' source.log 

說明

  • -vDate=...設置Date AWK變量與最初的日期時間(一小時前)。
  • BEGIN部生成由所述月份縮寫(它especific英制)
  • toDate()函數的行的字段轉換爲具有相同的格式Date變量(YYYMMDDhhmmss)的字符串索引的數組。
  • 最後,當條件toDate() > Date爲真時,awk輸出當前行(日誌條目)。