Apache-2.2

解析基於 NCSA 組合的日誌文件的方法

  • August 13, 2011

我在site:Google Server Fault、Super User 和 Stack Overflow 上進行了一些搜尋。我還檢查了非站點特定的結果,並沒有真正看到這樣的問題,所以這裡……

我確實發現了這個問題,與 grep 和 awk 相關,它有一些知識淵博,但我覺得文本資格挑戰沒有得到解決。這個問題也將範圍擴大到任何平台和任何程序。

我有基於 NCSA 組合格式的 squid 或 apache 日誌。當我說基於時,意味著文件中的前 n 個 col 是每個 NCSA 組合標準,可能會有更多 col 帶有自定義內容。

這是來自 squid 組合日誌的範例行:

1.1.1.1 - - [11/Dec/2010:03:41:46 -0500] "GET http://yourdomain.com:8080/en/some-page.html HTTP/1.1" 200 2142 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; C) AppleWebKit/532.4 (KHTML, like Gecko)" TCP_MEM_HIT:NONE

我希望能夠解析n日誌並輸出特定的列,用於排序、計數、查找唯一值等

主要的挑戰,是什麼讓它有點棘手,也是為什麼我覺得這個問題還沒有被問到或回答,是文本限定難題

當我從 grep/awk 問題中發現asql時,我非常興奮,但後來意識到它不支持開箱即用的組合,我猜我會考慮擴展。

期待答案,學習新東西!答案不必局限於平台或程序/語言。對於這個問題的上下文,我使用最多的平台是 Linux 或 OSX。

乾杯

使用 Perl,在為 darwin-thread-multi-2level (OSX) 建構的 v5.10.0 上測試

要列印 UserAgent 列:

perl -n -e '/^([^ ]+) ([^ ]+) ([^ ]+) (\[[^\]]+\]) "(.*) (.*) (.*)" ([0-9\-]+) ([0-9\-]+) "(.*)" "(.*)"/; print "$11\n"' -- test.log
  • 選項-n,而每一行test.log
  • 選項-e一執行緒序

我從 PHP 食譜中竊取並調整了我在Google上搜尋的 perlre 。我$從 re 的末尾刪除了支持基於 NCSA 組合的自定義格式。該模式可以輕鬆擴展以提供更多組。

正則表達式組()最終成為局部$1變數$n

快速而骯髒,非常容易擴展和編寫腳本。

管道輸出的一些範例:

  • | sort | uniq唯一的列值
  • | sort | uniq | wc -l唯一列數

歡迎批評和改進

引用自:https://serverfault.com/questions/214948