Apache-2.2
解析基於 NCSA 組合的日誌文件的方法
我在
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
唯一列數歡迎批評和改進