📋 核心要点
- awk 按行处理结构化文本,语法为
awk 'pattern {action}' filename,适合报告生成与文本解析 - 默认按空格/制表符分割字段,用
$1/$2…引用,-F可指定分隔符 - 内置变量:
$0整行、NF字段数、NR行号、FS/OFS输入/输出分隔符、RS/ORS记录分隔符 BEGIN在读取输入前执行(常用来打标题),END在读取完后执行(常用来汇总)- 支持
if/else/for/while流程控制与自定义变量
awk 由三位创始人姓氏首字母命名(Alfred Aho、Peter Weinberger、Brian Kernighan),用于处理结构化的文本数据,非常适合报告生成、数据分析和其他文本解析任务。
1. 基本语法
❯Bash
awk 'pattern {action}' filename
# pattern: 匹配条件,满足则执行对应动作,用斜杠(/pattern/)括起来
# {action}: 匹配条件为真时执行的命令2. 字段分割
awk 默认将输入行按空格或制表符分割成字段,通过 $1、$2…引用。可用 -F 或 --field-separator 指定其他分隔符。
❯Bash
# print $0 是整个字符串,$1 是第一个字段,以此类推
$ echo "Hello World" | awk '{print $2}'
World
$ echo "Hello World, Hello awk" | awk '{print $2 $3}'
World,Hello
$ echo "Hello World, Hello awk" | awk '{print $2 " " $3}'
World, Hello
$ echo "Hello World, Hello awk" | awk '{print "string is: " $2 " + " $3}'
string is: World, + Hello
# -F 指定分隔符(分隔符可以不止一个)
$ echo "Hello World, Hello awk" | awk -F "," '{print "string is: " $2}'
string is: Hello awk3. 匹配模式
用模式选择需要处理的行,模式可以是简单字符串或正则表达式。
❯Bash
# 打印包含 error 的行
awk '/error/ {print}' filename4. 条件语句
用 if 语句基于条件执行不同操作。
❯Bash
# 打印第一列大于 10 的行
$ awk '$1 > 10 {print}' filename5. 变量和函数
awk 支持内置变量、自定义变量,还可以定义和使用函数。
| 变量名 | 属性 |
|---|---|
$0 | 当前记录(整行) |
$1–$n | 当前记录的第 n 个字段 |
FS | 输入字段分隔符,默认空格 |
RS | 输入记录分隔符,默认换行符 |
NF | 当前记录的字段个数(列数) |
NR | 已读出的记录数(行号,从 1 开始) |
OFS | 输出字段分隔符,默认空格 |
ORS | 输出记录分隔符,默认换行符 |
❯Bash
# 只查看第 20 行到 30 行
$ awk '{if(NR>=20 && NR<=30) print $1}' test.txt
# 累加第一列并打印总和
$ awk '{sum += $1} END {print sum}' filename6. 流程控制
支持 if、else、for、while、do-while 等控制结构。
7. BEGIN 和 END 规则
BEGIN:在任何输入被读取之前执行的动作。END:所有输入被读取之后执行的动作。
❯Bash
# 先打印标题,后打印内容
$ awk 'BEGIN {print "ID\tValue"} {print $1 "\t" $2}' filename