我正在寻找一种方法来实现以下目标。
这是 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"
还有数千个,所以我需要一种方法:
- 查找一行是否包含 'host: "*"',其中 * 是 url
- 获取主机的值:“www.xxx.yyy”
- 去掉开头的 www
- 计算每个 xxx.yyy 出现的次数
- 按从最高到最低的顺序对每个唯一主机值的出现次数进行排序。
我一直在使用以下内容:
awk '($20 ~ /GET/)' /var/log/nginx/error_log | awk '{print $24}' | sort | uniq -c | sort -rn
但由于它没有删除“www”,因此存在重复的条目。
答案1
只awk
为你处理好一切
awk '$20 ~ /GET/{gsub(/"/, "", $24); sub(/[^.]*\./, "", $24); a[$24]++};
END{for (k in a)print k, a[k]}' /var/log/nginx/error_log