awk 统计 Nginx 日志的 5 种姿势(IP/状态码/响应时间)
前言Nginx 日志分析是运维和开发的日常必修课。虽然有很多专业工具(GoAccess、ELK、AWStats),但最快速、最灵活的方案往往是用awk 一行命令解决。本文将基于典型的 Nginx access log 格式,展示 5 个实战统计场景:从 IP 访问量、状态码分布,到响应时间分析,再到组合统计和时段过滤。日志格式说明我们以标准 Nginx combined 格式为例(实际字段位置请根据你的log_format调整):log_format combined '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' '$request_time';一条样例日志:192.168.1.100 - - [15/Oct/2023:13:25:36 +0800] "GET /api/users HTTP/1.1" 200 1523 "https://example.com/home" "Mozilla/5.0" 0.123字段位置映射(awk 中$1,$2…):字段编号内容示例值$1客户端 IP192.168.1.100$2占位符--$3远程用户-$4时间戳左括号[[15/Oct/2023:13:25:36$5时间戳其余部分 +0800]+0800]$6请求方法"GET"GET$7请求路径/api/users$8协议HTTP/1.1"HTTP/1.1"$9状态码200$10响应字节数1523$11Referer 前半"https://example.com/home"“https://example.com/home”$12User-Agent 前半"Mozilla/5.0"“Mozilla/5.0”$13请求时间(秒)0.123⚠️注意:由于$time_local、$request、$http_referer、$http_user_agent包含空格和引号,awk 默认按空格分割会导致字段错位。解决方案:后续所有命令会使用awk的-F'"'或固定字段位置适应你的格式。如果你的 Nginx 使用了$time_iso8601或自定义格式,请相应调整。场景 1:统计访问最多的 IP(TOP 10)需求统计日志中每个 IP 的访问次数,按降序输出前 10 名。命令