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 这类日常命令练起,熟能生巧。
- 点赞
- 收藏
- 关注作者
评论(0)