Apache-2.2

你有任何有用的 awk 和 grep 腳本來解析 apache 日誌嗎?

  • October 27, 2015

我可以使用日誌分析器,但通常我需要解析最近的網路日誌以查看目前發生的情況。

我有時會做一些事情,比如找出請求某個文件的前 10 個 ip

cat foo.log | grep request_to_file_foo | awk '{print $1}' |  sort -n | uniq -c | sort -rn | head

你的工具箱裡有什麼?

您可以僅使用 awk 對 apache 日誌文件執行任何操作。Apache 日誌文件基本上是用空格分隔的,您可以假裝引號不存在,並通過列號訪問您感興趣的任何資訊。唯一出現這種情況的情況是,如果您擁有組合日誌格式並且對使用者代理感興趣,此時您必須使用引號 (") 作為分隔符並執行單獨的 awk 命令。以下將顯示您的 IP每個請求索引頁面的使用者按點擊次數排序:

awk -F'[ "]+' '$7 == "/" { ipcount[$1]++ }
   END { for (i in ipcount) {
       printf "%15s - %d\n", i, ipcount[i] } }' logfile.log

$ 7 is the requested url. You can add whatever conditions you want at the beginning. Replace the ’ $ 7 == “/” 包含您想要的任何資訊。

如果您更換 $ 1 in (ipcount[ $ 1]++),然後您可以按其他標準對結果進行分組。使用 $7 將顯示訪問了哪些頁面以及訪問頻率。當然,你會想在一開始就改變條件。以下將顯示使用者從特定 IP 訪問了哪些頁面:

awk -F'[ "]+' '$1 == "1.2.3.4" { pagecount[$7]++ }
   END { for (i in pagecount) {
       printf "%15s - %d\n", i, pagecount[i] } }' logfile.log

您還可以通過 sort 管道輸出以按順序獲取結果,可以作為 shell 命令的一部分,也可以在 awk 腳本本身中:

awk -F'[ "]+' '$7 == "/" { ipcount[$1]++ }
   END { for (i in ipcount) {
       printf "%15s - %d\n", i, ipcount[i] | sort } }' logfile.log

如果您決定擴展 awk 腳本以列印出其他資訊,後者會很有用。這完全取決於你想知道什麼。這些應該作為您感興趣的任何內容的起點。

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