awk计算Web日志平均响应时间需先定位字段(如Nginx的$NF或$NF-1、Tomcat的倒数第二/三列),再累加非空数值并计数,最后相除;支持按接口、状态码过滤及单位转换、精度控制和异常值剔除。

直接用 awk 计算 Web 日志平均响应时间,关键在于准确定位响应时间字段、做数值累加和计数,最后相除。不同日志格式字段位置不同,但逻辑一致。
确认响应时间字段位置
Nginx 默认 combined 日志中,$NF(最后一列)是 $request_time;Tomcat access log 中通常是倒数第二或第三字段(如 %D 或 %F)。先用 head 看几行确认:
-
head -3 access.log查看实际字段顺序 - 常见 Nginx 格式:
... "GET /xxx" 200 1234 0.345 0.123 ...→ 倒数第二列是 $request_time(秒),最后一列是 $upstream_response_time - 若启用了
log_format自定义,比如末尾加了$request_time,那它就是 $NF;若在中间,需按实际列数取,例如第 10 列就写$10
基础计算:总和 ÷ 总行数
最简方式——对所有非空响应时间求平均:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
awk '{if ($NF ~ /^[0-9.]+$/) {sum += $NF; count++}} END {if (count>0) print sum/count}' access.log- 这里用
$NF ~ /^[0-9.]+$/过滤掉非数字(如“-”或空字段),避免报错 - 结果单位与日志一致:Nginx 的
$request_time是秒,Tomcat 的%D是毫秒
按接口或状态码分组计算
比如只算 /api/user 接口的平均响应时间:
awk '$7 ~ /^"GET \/api\/user/ || $7 ~ /^"POST \/api\/user/ {sum += $NF; count++} END {print "API avg:", sum/count "s"}' access.log-
$7是请求行字段(如"GET /api/user HTTP/1.1"),正则匹配路径 - 若要算 500 错误的平均耗时:
awk '$9 == 500 {sum += $NF; count++} END {print "500 avg:", sum/count "s"}' access.log
处理单位与精度
响应时间常带小数,可控制输出格式:
- 保留 3 位小数:
printf "%.3f\n", sum/count - 转为毫秒显示(适用于 Nginx 的秒级字段):
printf "%.0f ms\n", sum/count * 1000 - 跳过超长异常值(如 >60 秒)避免拉高均值:
if ($NF > 0 && $NF

















