计算网络服务器日志中每个 URI 的请求和状态代码

Counting requests and status codes per URI in a webserver log

给定一个典型的网络服务器日志文件,其中包含绝对 URL、相对 URL、人工请求和机器人(一些示例行)的混合:

112.77.167.177 - - [01/Apr/2016:22:40:09 +1100] "GET /bad-credit-loans/abc/ HTTP/1.1" 200 7532 "-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"
189.181.124.177 - - [31/Mar/2016:23:10:47 +1100] "GET /build/assets/css/styles-1a879e1b.css HTTP/1.1" 200 31654 "https://www.abc.com.au/customer-reviews/" "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13D15 Safari/601.1"
110.76.15.146 - - [01/Apr/2016:00:25:09 +1100] "GET http://www.abc.com.au/car-loans/low-doc-car-loans/ HTTP/1.1" 301 528 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"

我希望列出所有请求的 URI 以及状态代码(200、302 等)和请求总数,即

如果不是因为存在不同的 IP 地址、时间戳、引用 URL 和用户代理,我可以将 uniqsort标准时尚。或者,如果我事先知道所有 URL,我可以简单地以最简单的形式遍历每个 URL-状态代码组合和 grep

我们如何忽略不同的项目(用户代理、时间戳等)并仅提取 URLs 及其状态代码的频率?

您应该认识到有趣的部分总是在恒定的字段位置(相对于 space 分隔字段)。

URL在第7位,状态码在第9位。

其余的都是微不足道的。你可以例如使用:

awk '{sum[ " " ]++;tot++;} END { for (i in sum) { printf "%s %d\n", i, sum[i];} printf "TOTAL %d\n", tot;}' LOGFILES 

如果您需要对输出进行排序,然后使用排序结果进行排序。