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]+=$N | END 里遍历数组输出,key 过多时占用内存 |
END 里写 print c+0 是值得养成的习惯:没有匹配行时变量未初始化,直接 print 会输出空行,加上 +0 保证得到明确的 0。
计算平均前先确认分母:包含表头行、空行或非法数值行会让计数偏大,用 NR>1 与数值判断过滤掉这些行。