
site:
我在 Google 上搜尋了一些有關伺服器故障、超級用戶和堆疊溢位的資訊。我還檢查了非特定網站的結果,但並沒有真正看到這樣的問題,所以這裡...
我確實發現了這個問題,與 grep 和 awk 有關其中有一些很好的知識,但我不認為文本資格挑戰得到解決。這個問題也將範圍擴大到任何平台和任何程式。
我有基於 NCSA 組合格式的魷魚或阿帕奇日誌。當我說「基於」時,表示文件中的前 n 個欄位符合 NCSA 組合標準,可能還有更多帶有自訂內容的欄位。
以下是魷魚組合日誌中的範例行:
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 問題中,我非常興奮,但後來意識到它不支援開箱即用的組合,我想我會考慮擴展。
期待答案,並學習新事物!答案不必局限於平台或程式/語言。對於這個問題的上下文,我最常使用的平台是 Linux 或 OSX。
乾杯
答案1
使用 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
單行程式
我偷了並調整了我在谷歌上搜尋到的 perlre來自 PHP 食譜。我$
從末尾刪除了 re 以支援基於 NCSA 組合的自訂格式。此模式可以輕鬆擴展以提供更多組。
正規表示式組()
最終作為局部$1
變量$n
快速而骯髒,並且非常容易擴展和編寫腳本。
管道輸出的一些範例:
| sort | uniq
唯一的列值| sort | uniq | wc -l
唯一列數
歡迎批評和改進
答案2
儘管它不直接解決文字限定問題,但在組合格式中可以利用的一個因素是剩餘的空格分隔列始終位於同一列中。因此,您可以透過使用帶有 printf 和 NF(列數)的循環來解決該問題
根據 awk 的說法,$0 是整個輸入行,$1 是第一列,$2 是第二列,$NF 是最後一列。
因此,對於標準 NCSA 組合,用戶代理是列 $13 到列 $NF
我需要刪除第一列並將其與修改後的日誌格式的最後一列交換(代理IP已新增到最後一列)。
所以應該回傳的是 $NF 列,然後是第二列 ($2),然後是剩餘的列直到 NF - 1
我能夠透過以下方式做到這一點:-
awk '{ printf "%s ", $NF; for (i=2; i<=NF-1; i++) printf "%s ", $i; printf "\n";}' < /var/log/nginx/access.log