awk是Linux运维中处理结构化文本的核心工具,本质为逐行读入、按分隔符切片、条件判断、执行动作的微型编程语言;掌握按列切割、条件过滤、统计计算三类操作可覆盖90%日志分析等场景。

awk 是 Linux 运维中处理结构化文本的核心工具,本质是“逐行读入 → 按分隔符切片 → 条件判断 → 执行动作”,不是简单过滤器,而是带变量、逻辑和函数的微型编程语言。掌握按列切割、条件过滤、统计计算这三类操作,就能覆盖 90% 的日志分析、配置提取和报表生成场景。
按列切割:精准提取字段
默认以空格或制表符分隔,但生产环境多为冒号(/etc/passwd)、逗号(CSV)、竖线(日志)等非标准分隔符,必须用 -F 显式指定:
- 提取用户名和 UID:`awk -F ':' '{print $1, $3}' /etc/passwd`
- 取 CSV 第 2 列和第 4 列:`awk -F ',' '{print $2, $4}' data.csv`
- 取最后一列(通用技巧):`awk -F '|' '{print $NF}' access.log`($NF 自动指向末字段,无需数列数)
- 跳过空行或注释行再切:`awk -F '=' '!/^$/ && !/^[[:space:]]*#/ {print $1}' /etc/default/grub`
条件过滤:只处理目标行
过滤不是靠管道拼接,而是在 awk 内部用逻辑表达式完成,更高效、更可控:
- 匹配状态码为 404 的日志行:`awk '$9 == "404" {print $1, $4, $9}' access.log`($9 是 Apache 日志第 9 字段)
- UID 大于等于 1000 的普通用户:`awk -F ':' '$3 >= 1000 {print $1, $6}' /etc/passwd`
- 正则匹配进程名含 nginx 或 httpd:`ps aux | awk '$11 ~ /(nginx|httpd)/ {print $2, $11}'`
- 排除特定字段为空的行:`awk -F '\t' '$5 != "" && $7 > 0 {print}' report.tsv`
统计计算:内置变量 + 累加逻辑
awk 的统计能力远超 grep + wc,支持计数、求和、频次、分组汇总,关键在 BEGIN、普通块、END 三段式结构:
- 统计某状态出现次数:`awk '$6 == "ESTABLISHED" {c++} END {print "ESTABLISHED:", c+0}' netstat.out`(c+0 防止空结果输出空白)
- 按部门分组统计人数(频次):`awk -F ',' '{dept[$3]++} END {for (d in dept) print d, dept[d]}' emp.csv`
- 计算某列总和(如磁盘使用字节数):`df -B1 | awk '$1 ~ /^\/dev/ {sum += $3} END {print "Total used (bytes):", sum}'`
- 带表头的格式化统计报表:`awk 'BEGIN {print "USER\tUID\tSHELL"} -F ":" $3>=1000 {print $1 "\t" $3 "\t" $7} END {print "——— Total:", NR}' /etc/passwd`
进阶组合:一次命令完成切割+过滤+统计
真实运维常需多步合一。例如分析 Nginx 日志中每个 IP 的 5xx 错误请求量,并只显示前 5 名:
- `awk '$9 >= 500 && $9
- 说明:先用 $9 过滤 5xx 状态码,用数组 ip[$1] 按 IP 计数,END 中调用 shell 排序截取 —— 这就是 awk 与系统命令自然协作的能力。


















