awk计算日志某列总和与平均值的核心是累加该列并统计行数,最后用总和除以行数;支持指定列号、过滤非数字行、自定义分隔符及扩展统计最大值最小值。

用 awk 计算日志文件中某一列数值的总和与平均值,核心是累加该列并统计行数,最后用总和除以行数即可。
指定列号求和并计算平均值
假设日志按空格或制表符分隔,想计算第 3 列(比如响应时间、字节数等)的总和与平均值:
awk '{sum += $3; count++} END {if (count > 0) print "sum:", sum, "avg:", sum/count}' logfile.log
说明:
-
$3表示取每行第 3 个字段;可替换成任意列号,如$5 -
sum += $3累加该列所有数值(非数字字段会被当作 0 处理) -
count++统计处理的行数(含有效/无效数据行) -
END块在全部行读完后执行,避免除零错误需判断count > 0
只对纯数字行统计(跳过标题或异常行)
如果日志开头有表头,或某些行该列为空/非数字,可加条件过滤:
awk '$3 ~ /^[0-9]+\.?[0-9]*$/ {sum += $3; count++} END {if (count > 0) print "sum:", sum, "avg:", sum/count}' logfile.log
说明:
-
$3 ~ /^[0-9]+\.?[0-9]*$/只匹配整数或小数形式的数字(不含负号、科学计数法) - 更宽松的写法:
$3 != "" && $3 + 0 == $3—— 利用 awk 类型转换特性判断是否为有效数字
按分隔符明确指定(如逗号、竖线)
若日志是 CSV 或用其他字符分隔,需用 -F 指定分隔符:
awk -F',' '{sum += $4; count++} END {if (count > 0) print "sum:", sum, "avg:", sum/count}' access.csv
说明:
-
-F','表示以逗号为字段分隔符 -
-F'|'用于竖线分隔,-F'\t'用于制表符 - 注意:CSV 中若有引号包裹的字段(含逗号),
awk默认无法正确解析,此时建议用专用工具如csvtool或Miller
同时输出总和、平均值、最大值、最小值
扩展一下,常用统计可一并完成:
awk '{if (NF >= 3 && $3 != "") {sum += $3; count++; if (count == 1 || $3 > max) max = $3; if (count == 1 || $3 0) print "sum:", sum, "avg:", sum/count, "min:", min, "max:", max}' logfile.log
说明:
-
NF >= 3确保该行至少有 3 个字段,防止引用$3出错 -
$3 != ""排除空字段 - 首次赋值
max/min时用count == 1判断,避免初始值干扰











