一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux 如何使用 awk 统计日志中特定列的和

时间:2026-09-02 19:31:49 编辑:袖梨 来源:一聚教程网

用awk统计日志某列之和,需先确认分隔符与目标列号,再用{sum+=$n}累加,END{print sum}输出;支持条件筛选、正则校验及多分隔符处理。

awk 统计日志中某列的和,核心是让 awk 逐行读取、提取目标字段,再累加。关键是明确列号(或分隔符)和过滤条件。

确认日志字段分隔符和目标列号

多数日志用空格、制表符或特定字符(如 |,)分隔。先用 head -n 1 日志文件 看首行,再用 awk -F' ' '{print NF; print $1,$2,$3}' 文件 | head -1 快速观察字段数和内容。比如 Nginx 默认日志中字节数通常在第10列,Apache 可能在第9列。

基础求和:直接累加指定列

假设日志以空格分隔,要统计第5列的数值总和:

awk '{sum += $5} END {print sum}' access.log

说明:

- $5 表示每行第5个字段

- sum += $5 每行自动累加

- END 块在处理完所有行后执行,只输出一次结果

- 若该列含非数字(如“-”或“-”表示缺失),awk 会按0处理;如需跳过,加判断:

  1. awk '$5 != "-" && $5 != "" {sum += $5} END {print sum}' access.log
  2. 更稳妥写法:awk '$5 ~ /^[0-9]+$/ {sum += $5} END {print sum}' access.log(仅匹配纯数字)

带条件筛选后再求和

例如只统计状态码为 200 的响应字节数(假设字节数在第10列,状态码在第9列):

awk '$9 == 200 {sum += $10} END {print sum}' access.log

也可组合多个条件:

  1. awk '$9 == 200 && $10 > 0 {sum += $10} END {print sum}' access.log
  2. 按时间范围:比如第4列是 [10/Jan/2024:14: 这类时间,提取小时并统计某小时的请求数:awk -F'[:[ ]' '$5 == 14 {count++} END {print count}' access.log(这里用 -F'[:[ ]' 同时以 :[、空格切分,第5段即小时)

处理 CSV 或其他分隔符日志

若日志是逗号分隔(CSV),需显式指定分隔符:

awk -F',' '{sum += $3} END {print sum}' data.csv

注意:若 CSV 含引号包裹的字段(如 "a,b",c,100),标准 awk 不解析引号,此时建议先用 csvkit 或改用 gawk 配合 FPAT,但简单场景下可先用 sed 预处理,例如删引号:sed 's/"//g' file.csv | awk -F',' '{sum += $3} END {print sum}'

热门栏目