2016-12-29 128 views
-1

我需要幫助,因爲我是日誌解析的新手。我試圖提取所有具有200狀態的日誌行,並在15:35之前15小時的時間戳。我無法弄清楚要使用的正則表達式。解析nginx日誌中的時間戳

這裏是日誌的示例:

198.104.78.160 [26/DEC/2016:15:24:12 -0500] 200 200 190.50.175.65:8080 testtest.com GET/API/bid_request?feed = 1 & auth = qwerty & ip = 85.194.119.3 & ua = Mozilla%2F5.0 +%28Windows + NT + 6.1%3B + Win64%3B + x64%29 + AppleWebKit%2F537.36 +%28KHTML% 2C + like + Gecko%29 + Chrome%2F48.0.2564.97 + Safari%2F537.36 & lang = tr-TR%2Ctr%3Bq%3D0.8%2Cen-US%3Bq%3D0.6%2Cen%3Bq% 3D0.4 & ref = http%3A%2F%2Fserve.pop.net%2Fs HTTP/1.0 - - - 174.194.36.141 - 0.109-0.009 US /

回答

1

您可以使用awk做到這一點:

awk -v status_code=200 -v ts_at_hour=15 -v ts_before_hour=15 -v ts_before_min=35 ' 

    { 
     match($0, /[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\s+\[[0-9]{2}\/[a-zA-Z]{3}\/[0-9]{4}:([0-9]{2}):([0-9]{2}):([0-9]{2})\s+[+-][0-9]{4}\]\s+([0-9]{3})/, items) 

     if (items[1] == ts_at_hour && 
      items[1] <= ts_before_hour && 
      items[2] < ts_before_min && 
      items[4] == status_code){ 
      print $0 
     } 
    } 
' data.txt 

設置一些變量來存儲您的要求status_codets_at_hourts_before_hourts_before_min(您可以定義環境瓦爾他們)

的正則表達式是一個match,重點關注4組:小時,分鐘,秒由([0-9]{2})定義,status_code在末尾([0-9]{3})

分解正則表達式,您有:

  • 隨後空間\s+(或更多)
  • 的日期部分,其包括小時,分鐘和秒\[[0-9]{2}\/[a-zA-Z]{3}\/[0-9]{4}:([0-9]{2}):([0-9]{2}):([0-9]{2})\s+[+-][0-9]{4}\](注意之間的3組的IP地址[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+()
  • 與狀態碼([0-9]{3})