AWK 语法速查表(Linux 文本处理工具实用指南)
本文适用于系统管理员、运维工程师、开发人员以及数据处理人员,提供 速查+示例 的格式,方便在使用 AWK 时快速查阅。
1. 基本结构
awk '条件 {动作}' 文件名
- 条件:可以是模式匹配、表达式、行号等
- 动作:执行的操作,如 print、赋值、统计等
- 默认操作为 print $0(即打印整行)
2. 常用内建变量
变量 | 含义 |
$0 | 当前整行 |
$1~$n | 第 1 至第 n 个字段 |
NR | 当前处理的行号 |
FNR | 当前文件中的行号(用于多文件) |
NF | 当前行字段总数 |
FS | 输入字段分隔符(默认空格) |
OFS | 输出字段分隔符 |
RS | 输入行分隔符(默认换行) |
ORS | 输出行分隔符 |
FILENAME | 当前正在处理的文件名 |
3. 快速命令速查(经典用法)
基础操作
awk '{print}' file.txt # 打印每一行
awk '{print $1}' file.txt # 打印第一列
awk '{print $1, $3}' file.txt # 打印第1和第3列
awk '{print NR, $0}' file.txt # 打印行号+整行内容
条件匹配
awk '$1 == "root"' /etc/passwd # 第1列是root的行
awk '$3 > 1000' /etc/passwd # 第3列大于1000的行
awk '$1 ~ /nginx/' access.log # 第1列包含nginx
awk '$1 !~ /test/' file.txt # 第1列不包含test
多条件
awk '$3 > 50 && $3 < 100' scores.txt
awk '$2 == "yes" || $4 == "pass"' file.txt
范围与行号
awk 'NR==3' file.txt # 第3行
awk 'NR>=2 && NR<=5' file.txt # 第2~5行
awk 'NR%2==0' file.txt # 偶数行
4. 格式化输出
awk '{printf "Name: %-10s Score: %3d\n", $1, $2}' students.txt
- %-10s:左对齐字符串,宽度10
- %3d:右对齐数字,宽度3
5. 统计计算
awk '{sum += $2} END {print "Total:", sum}' file.txt
awk '{if($2>60) pass++} END {print "Passed:", pass}'
awk '{count++; sum+=$3} END {print "Avg:", sum/count}'
6. 字符串处理函数
函数 | 用法示例 | 说明 |
length(s) | length($1) | 返回长度 |
substr(s,m,n) | substr($1,2,3) | 字符串子串 |
index(s,t) | index($1,"abc") | 子串位置 |
tolower(s) | tolower($1) | 转小写 |
toupper(s) | toupper($1) | 转大写 |
split(s,a,sep) | split($1,arr,",") | 字符串分割为数组 |
7. 数组与聚合
awk '{count[$1]++} END {for (i in count) print i, count[i]}' file.txt
awk '{sum[$2]+=$3} END {for (i in sum) print i, sum[i]}' scores.txt
- 实现“分组计数 / 分组求和”等聚合功能
8. BEGIN 与 END 模块
awk 'BEGIN {print "Start"} {print $1} END {print "Done"}' file.txt
- BEGIN{}:在读文件前执行一次
- {}:每行执行
- END{}:读完后执行一次
9. 设置分隔符(输入/输出)
awk 'BEGIN {FS=":"; OFS=","} {print $1, $3}' /etc/passwd
- FS=":":输入按冒号分割
- OFS=",":输出用逗号连接字段
10. 实用小技巧合集
用法 | 示例 |
查看字段数 | awk '{print NF}' |
删除首列 | awk '{$1=""; print}' |
删除空行 | awk 'NF>0' |
查看最大值 | awk '$1>max {max=$1} END{print max}' |
倒序输出 | awk '{a[NR]=$0} END{for(i=NR;i>=1;i--) print a[i]}' |
示例练习题(建议实操)
- 提取 CSV 中年龄 > 30 的用户行
- 统计访问日志中每个 IP 的访问次数
- 计算学生成绩表的平均分和最高分
- 删除日志中重复行,仅保留第一条
- 将原始数据表按字段重排序并输出为 JSON 格式(进阶)
总结:常见 awk 使用清单
类别 | 关键命令 |
打印 | print / printf |
条件 | == != ~ !~ |
结构 | BEGIN / END |
变量 | $0 $1 NF NR |
分隔符 | FS / OFS |
聚合 | sum[] / count[] |
函数 | length substr split |