Text-Processing

分析nginx錯誤日誌

  • December 30, 2014

我正在尋找以下方法。

這是 nginx 錯誤日誌中的一行。

2014/12/29 21:17:57 [error] 30078#0: *311826 openat() "/var/www/html/images/images/Outlet-Celine-Boston-Square-Calfskin-Bags-Red_celine_2140_1.jpg" failed (2: No such file or directory), client: 207.46.13.42, server: server.domain.tld, request: "GET /images/images/Outlet-Celine-Boston-Square-Calfskin-Bags-Red_celine_2140_1.jpg HTTP/1.1", host: "www.buylvneverfullpm.net"

還有數千個,所以我需要一種方法:

  1. 查找一行是否包含 ‘host: “*"’,其中 * 是 url
  2. 獲取主機的值:“www.xxx.yyy”
  3. 去掉開頭的 www
  4. 計算每個 xxx.yyy 出現的次數
  5. 將每個唯一主機值的出現次數從高到低排序。

我一直在使用以下內容:

awk '($20 ~ /GET/)' /var/log/nginx/error_log | awk '{print $24}' | sort | uniq -c | sort -rn

但由於它沒有去掉“www”,所以有重複的條目。

只需awk為您處理一切

awk '$20 ~ /GET/{gsub(/"/, "", $24); sub(/[^.]*\./, "", $24); a[$24]++};
END{for (k in a)print k, a[k]}' /var/log/nginx/error_log

引用自:https://unix.stackexchange.com/questions/176619