awk 按列求和与分组统计
日志里有一列是响应时间,想按接口分组算平均值和 99 分位,又不想写 Python。
求和:
awk '{sum+=$NF; n++} END {printf "%.2f\n", sum/n}' access.log
分组:
awk '{c[$7]++; t[$7]+=$NF} END {for (k in c) printf "%-20s %6d %8.1f\n", k, c[k], t[k]/c[k]}' access.log
注意 awk 的关联数组是无序的,要排序得靠 | sort -k2 -nr。大文件用 LC_ALL=C 能快不少,因为跳过 UTF-8 校验。
99 分位 awk 做起来别扭,得把值存进数组再排序,这时候用 sort -n | awk 组合更顺手:
awk '{print $NF}' access.log | sort -n | awk '{a[NR]=$1} END {print a[int(NR*0.99)]}'