别再手动算列:awk 的四个日常用法

举报
yiboyun 发表于 2026/11/11 16:28:16 2026/11/11
【摘要】 日志里想统计每个 IP 出现了几次、CSV 里想取第 3 列求和、配置文件里想批量提取某个字段,这些活如果靠眼睛数列、靠编辑器一行行改,又慢又容易错。awk 是 Linux 自带的文本处理工具,专门按列处理,学会四个用法,日常算列不用再手动数。 1. 取列:先分清分隔符awk 默认按空格和 Tab 分列,$1 是第一列,$2 是第二列,$0 是整行。想取 ps 输出里的进程名和内存:ps a...

日志里想统计每个 IP 出现了几次、CSV 里想取第 3 列求和、配置文件里想批量提取某个字段,这些活如果靠眼睛数列、靠编辑器一行行改,又慢又容易错。awk 是 Linux 自带的文本处理工具,专门按列处理,学会四个用法,日常算列不用再手动数。

1. 取列:先分清分隔符

awk 默认按空格和 Tab 分列,$1 是第一列,$2 是第二列,$0 是整行。想取 ps 输出里的进程名和内存:

ps aux | awk '{print $2, $4, $11}'

这条只输出 PID、内存占比和命令三列。如果是逗号分隔的 CSV,要先用 -F 指定分隔符:

awk -F, '{print $1, $3}' data.csv

先确认分隔符再取列,是用 awk 的第一步,分隔符错了,后面全错。

2. 按条件过滤:只看符合条件的行

awk 可以在取列之前先过滤。只看状态码是 500 的日志行,并输出时间和 IP:

awk '$9 == 500 {print $1, $4}' access.log

$9 是第 9 列,== 是等于。想看某个 IP 的所有请求:

awk '$1 == "192.168.1.10"' access.log

条件写在花括号前面,符合条件的行才执行后面的动作。先过滤再处理,输出立刻干净很多。

3. 统计求和:不用再导进表格

awk 自带变量,可以边读边算。统计每个 IP 出现了几次:

awk '{count[$1]++} END {for (ip in count) print ip, count[ip]}' access.log

count[$1]++ 是按 IP 计数,END 是在读完所有行之后执行,循环打印结果。求某一列的总和也一样:

awk '{sum += $5} END {print sum}' data.txt

日志分析、账单对数这类“先分组、再汇总”的活,一条 awk 就能出结果,不用先导进 Excel。

4. 格式化输出:结果直接能看

awk 的 printf 可以控制输出格式,对齐列、保留小数都行。把内存占用按 MB 输出并保留一位小数:

ps aux | awk 'NR>1 {printf "%-10s %8.1f MB\n", $11, $6/1024}'

NR>1 是跳过标题行,%-10s 左对齐占 10 字符,%8.1f 保留一位小数。输出整齐了,贴到汇报里、发给别人看都方便。

小结

取列先定分隔符、按条件先过滤、统计用变量累加、输出用 printf 对齐。awk 的语法一开始看着有点怪,但这四个用法都是“先想清楚要什么列、什么条件、怎么汇总”,想清楚了再写,基本一次就能对。列数多了、文件大了,awk 比手动翻快得多。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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