📋 核心要点
  • 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 awk

3. 匹配模式

用模式选择需要处理的行,模式可以是简单字符串或正则表达式。

Bash
# 打印包含 error 的行
awk '/error/ {print}' filename

4. 条件语句

if 语句基于条件执行不同操作。

Bash
# 打印第一列大于 10 的行
$ awk '$1 > 10 {print}' filename

5. 变量和函数

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}' filename

6. 流程控制

支持 ifelseforwhiledo-while 等控制结构。

7. BEGIN 和 END 规则

  • BEGIN:在任何输入被读取之前执行的动作。
  • END:所有输入被读取之后执行的动作。
Bash
# 先打印标题,后打印内容
$ awk 'BEGIN {print "ID\tValue"} {print $1 "\t" $2}' filename