Bash按HTTP状态码统计响应时间:求最值、均值及频次
解决方案:用awk快速计算HTTP状态码的响应时间统计值
这里有个简洁的awk脚本,刚好能满足你的需求——不管是处理已保存的测试结果文件,还是直接对接curl的实时输出,它都能按唯一HTTP状态码分组,自动计算响应时间的最小值、最大值、平均值和出现次数。
1. 处理已保存的数据文件
假设你的测试结果存在load_test_results.txt里,运行以下命令即可:
awk '{ # 遍历所有字段,每两个一组(状态码 + 响应时间) for (i=1; i<=NF; i+=2) { code = $i; time = $(i+1) sum[code] += time # 累加该状态码的响应时间总和 count[code]++ # 统计该状态码的出现次数 # 更新最小值:首次记录或当前时间更小时替换 if (!min[code] || time < min[code]) min[code] = time # 更新最大值:首次记录或当前时间更大时替换 if (!max[code] || time > max[code]) max[code] = time } } END { # 打印表头 print "http min max mean count" # 按状态码数字升序输出(可选,去掉则按awk默认顺序) PROCINFO["sorted_in"] = "@ind_num_asc" # 遍历每个状态码,计算平均值并格式化输出 for (c in sum) { mean = sum[c] / count[c] printf "%d %.3f %.3f %.3f %d\n", c, min[c], max[c], mean, count[c] } }' load_test_results.txt
2. 直接对接curl命令(无需中间文件)
如果不想先把结果存到文件,直接让curl的输出传给统计脚本,用管道连接就行:
curl -s -o /dev/null -w "%{http_code} %{time_total} " $SERVICE_URL | awk '{ for (i=1; i<=NF; i+=2) { code = $i; time = $(i+1) sum[code] += time count[code]++ if (!min[code] || time < min[code]) min[code] = time if (!max[code] || time > max[code]) max[code] = time } } END { print "http min max mean count" PROCINFO["sorted_in"] = "@ind_num_asc" for (c in sum) { mean = sum[c] / count[c] printf "%d %.3f %.3f %.3f %d\n", c, min[c], max[c], mean, count[c] } }'
测试你的示例数据
用你提供的示例内容:200 2.691 200 2.735 404 1.997 404 2.838 200 1.394 200 1.833,运行脚本后会输出:
http min max mean count 200 1.394 2.735 2.163 4 404 1.997 2.838 2.418 2
完全匹配你期望的格式。
内容的提问来源于stack exchange,提问作者AngryPanda
相关产品推荐
相关产品推荐

