awk 入门:一行命令搞定文本处理

举报
yd_283574177 发表于 2026/11/01 20:39:56 2026/11/01
【摘要】 在 Linux 日常运维和开发中,我们经常要处理日志、CSV、配置文件这类结构化文本。grep 擅长查找,sed 擅长替换,而 awk 的强项是“按列处理”——它能把每一行自动切分成字段,然后对字段做判断、计算和格式化输出。掌握几个常用模式,一行命令就能替代几十行脚本。 一、awk 的基本工作模式awk 的核心结构是“模式 { 动作 }”:awk '模式 { 动作 }' 文件名awk 会逐行...

在 Linux 日常运维和开发中,我们经常要处理日志、CSV、配置文件这类结构化文本。grep 擅长查找,sed 擅长替换,而 awk 的强项是“按列处理”——它能把每一行自动切分成字段,然后对字段做判断、计算和格式化输出。掌握几个常用模式,一行命令就能替代几十行脚本。

一、awk 的基本工作模式

awk 的核心结构是“模式 { 动作 }”:

awk '模式 { 动作 }' 文件名

awk 会逐行读取输入,对每一行先按分隔符切分成字段:$0 表示整行,$1、$2……表示第 1、2……列,NF 表示当前行的字段总数,NR 表示当前是第几行。默认分隔符是空白字符(空格或制表符),可以用 -F 指定,比如 -F: 按冒号切分。

二、五个高频用法

1. 取指定列

# 取 /etc/passwd 的用户名和登录 shell
awk -F: '{print $1, $7}' /etc/passwd

2. 按条件过滤行

# 找出磁盘使用率超过 80% 的分区
df -h | awk '$5+0 > 80 {print $1, $5}'

注意 $5 像 80% 这样带百分号的字符串,加上 +0 可以转成数字再比较,这是 awk 里很实用的小技巧。

3. 求和与统计

# 统计 access.log 的总流量(假设第 10 列是字节数)
awk '{sum += $10} END {print "总流量(字节):", sum}' access.log

BEGIN 和 END 是两个特殊的模式:BEGIN 在读取第一行之前执行,常用来初始化变量和打印表头;END 在所有行处理完后执行,适合输出汇总结果。

4. 格式化输出

printf 可以控制对齐和精度:

ps aux | awk '{printf "%-10s %6s %s\n", $1, $3, $11}' | head

5. 去重计数

# 统计各 IP 的访问次数并排序
awk '{count[$1]++} END {for (ip in count) print count[ip], ip}' access.log | sort -nr | head

这里用到了关联数组 count[$1]++,以 IP 为键自动累加,是日志分析里最常用的模式之一。

三、内置变量速查

  • $0 / $n:整行 / 第 n 个字段
  • NR / FNR:已读总行数 / 当前文件行数
  • NF:当前行字段数
  • FS / OFS:输入 / 输出字段分隔符
  • RS:记录分隔符,默认换行

四、小结

awk 的学习曲线很平缓:先记住“按列取数 + 模式过滤”,就能解决八成以上的文本处理需求;再掌握 BEGIN/END、printf 和关联数组,就可以写出实用的日志分析一句话命令。建议从 df -h | awk、ps aux | awk 这类日常命令练起,熟能生巧。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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