用 awk 按列处理文本:打印、过滤与简单统计

举报
yd_240997615 发表于 2026/11/06 09:54:13 2026/11/06
【摘要】 awk 是 Linux 文本处理的经典工具,特别擅长处理按列排布的数据,比如日志、表格和命令输出。它的基本模型很简单:逐行读取输入,把每行按分隔符切成字段,$1、$2 表示第几列,$0 是整行,然后对满足条件的行执行指定的动作。最常见的用法是打印指定列。例如 ps aux | awk '{print $1, $11}' 输出用户名和命令两列;awk '{print $1}' access.l...

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 就能把很多临时性的日志与数据问题在一行命令里解决。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。