首页/系统/Linux 运维命令速查/awk 统计:求和/均值/计数/极值
文本处理77 条

awk 统计:求和/均值/计数/极值

用 BEGIN/END 与变量聚合:求和 s+=$2、计数 n++、求平均 s/n、最大最小值,一行完成小报表。

Linux 运维命令速查系统更新于 2026-10-13

awk 聚合统计的思路

awk 做数值聚合靠的是「模式与动作」加变量累计:主体现在每行执行一次,END 在全部读完后执行一次,BEGIN 用来初始化。求和写成 s+=$N,计数写成 n++,平均在 END 里用 s/n 计算,极值靠条件比较更新变量并顺便记住整行。这套写法的好处是能在一行命令里算出总量、均值、最大最小值与条件计数,不需要引入任何额外工具,非常适合临时的日志与报表统计。

基本信息

适用平台Linux/macOS(gawk、mawk、BSD awk 均支持 BEGIN/END 与变量累加)
命令语法awk '{累加} END{输出}' 文件
执行结构BEGIN 初始化一次、主体现行执行、END 结束后执行一次
变量默认值未初始化变量在数值上下文中是 0,在字符串上下文中是空串
配套用法-F 指定分隔符,NR 行号、NF 字段数、$N 字段值

典型使用场景

  • 容量统计:日志里某列数值求和,得到总流量或总耗时
  • 性能粗算:计算平均响应时间与最大响应时间
  • 异常定位:找出数值列最大的那一行,定位最慢或最大的记录
  • 条件计数:统计状态码为 500 的记录数量
  • 分组汇总:按第一列 key 累加第二列数值,得到分组报表

常用示例

常用示例
awk '{s+=$3} END{print s}' data.txt                       # 第 3 列求和
awk '{s+=$3; n++} END{printf "avg=%.2f\n", s/n}' data.txt  # 平均值
awk 'BEGIN{m=0} $2>m{m=$2; line=$0} END{print line}' data.txt   # 最大值所在行
awk -F, 'NR>1 && $4=="error" {c++} END{print c+0}' app.csv      # 条件计数,跳过表头
awk '{a[$1]+=$2} END{for(k in a) print k, a[k]}' data.txt        # 按第一列分组求和
awk 'NR==1{max=$3} $3>max{max=$3} END{printf "max=%.0f\n", max}' data.txt

聚合写法对照

需求写法说明
求和{s+=$N} END{print s}把第 N 列数值全部累加
计数{n++} END{print n+0}+0 保证无匹配时输出 0 而不是空行
平均END{print s/n}注意除零,以及是否包含表头等无效行
最大值条件比较并保存变量需要保留原始行时额外记 line=$0
分组数组 a[key]+=$NEND 里遍历数组输出,key 过多时占用内存
END 里写 print c+0 是值得养成的习惯:没有匹配行时变量未初始化,直接 print 会输出空行,加上 +0 保证得到明确的 0。
计算平均前先确认分母:包含表头行、空行或非法数值行会让计数偏大,用 NR>1 与数值判断过滤掉这些行。

易错点

  • 把含逗号或单位的字符串列直接累加,会被当作 0 处理,统计结果严重偏低
  • 除数为 0 时得到 inf 或异常输出,算平均前必须确认计数大于 0
  • 浮点累计在超大数据量下会出现可见误差,金额类统计要显式控制精度
  • 分组用数组会把所有 key 保留在内存,key 数量极大时内存占用明显

数据来源与参考

  • man 1 awk(gawk 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌