用 awk 按列处理文本:打印、过滤与简单统计
awk 是 Linux 文本处理的经典工具,特别擅长处理按列排布的数据,比如日志、表格和命令输出。它的基本模型很简单:逐行读取输入,把每行按分隔符切成字段,$1、$2 表示第几列,$0 是整行,然后对满足条件的行执行指定的动作。
最常见的用法是打印指定列。例如 ps aux | awk '{print $1, $11}' 输出用户名和命令两列;awk '{print $1}' access.log 取出每一行的第一个字段,也就是访问日志里的来源 IP。默认按空白切分,处理其他分隔符用 -F 指定,比如 awk -F: '{print $1}' /etc/passwd 就能打印系统里的所有用户名。
过滤靠在花括号前写条件:awk '$3 > 1000' 只输出第三列数值大于 1000 的行;awk '/error/' 只输出包含 error 的行;两者可以组合着写,这类写法在临时分析日志时非常常用。BEGIN 和 END 是两个特殊时机:BEGIN 在读数据之前执行,常用来打印表头;END 在全部读完之后执行,适合做汇总。
统计是 awk 的强项。一行命令就能数出每个 IP 的访问次数:awk '{c[$1]++} END {for (ip in c) print c[ip], ip}' access.log,再接一个 sort -nr,就能排出访问量最高的来源。同理可以做求和与平均:awk '{s+=$2} END {print s, s/NR}',其中 NR 是已读行数、NF 是当前行的列数,这两个内置变量配合条件判断,能覆盖大多数临时统计需求。
注意两个容易踩的点:一是字段内容本身含空格时,单纯按空白切分会错位,处理这类数据要先确认真正的分隔符再用 -F 指定;二是浮点精度,awk 用双精度浮点计算,做金额这类要求精确的结果不合适,那是其他工具的活。
小结:记住「条件加动作」这个模型,用 $n 取列、-F 定分隔、END 做汇总,awk 就能把很多临时性的日志与数据问题在一行命令里解决。
- 点赞
- 收藏
- 关注作者
评论(0)