awk
是一个功能强大且灵活的文本处理工具,广泛用于在 Linux/Unix 系统中对结构化文本数据(如表格、日志文件、CSV 文件等)进行处理、分析和格式化输出。它能够基于模式匹配处理文本并进行操作。
下面是详细讲解 awk
的使用,包括语法、基本操作、字段处理、模式匹配等。
基本语法
awk 'pattern {action}' filename
- pattern:指定要匹配的行的模式(可以是正则表达式)。
- action:对匹配的行执行的动作。如果省略,默认输出匹配的行。
- filename:要处理的文件。
示例文件
假设有一个名为 data.txt
的文件,内容如下:
John 25 Male Developer
Alice 30 Female Manager
Bob 22 Male Designer
1. 打印整个文件内容
awk '{print}' data.txt
{print}
表示对每一行执行print
操作,这里没有指定模式,因此会打印文件的每一行。
2. 按照字段打印
awk
默认会把一行文本按空白字符(空格或制表符)分割成多个字段,每个字段使用 $1
, $2
, $3
, … 来表示。
awk '{print $1, $2}' data.txt
$1
表示第一列,$2
表示第二列。这个命令会打印文件中的前两列。
输出结果:
John 25
Alice 30
Bob 22
3. 使用特定的分隔符
如果文件中使用其他字符(如逗号、冒号等)作为分隔符,可以使用 -F
选项指定分隔符。
假设有一个以逗号分隔的文件 employees.csv
,内容如下:
John,25,Male,Developer
Alice,30,Female,Manager
Bob,22,Male,Designer
使用 awk
处理这个文件时,可以指定逗号作为分隔符:
awk -F ',' '{print $1, $4}' employees.csv
-F ','
表示以逗号,
作为分隔符。$1
和$4
分别表示第一列和第四列。
输出结果:
John Developer
Alice Manager
Bob Designer
4. 条件匹配
可以使用条件来匹配指定的行并处理。例如,查找性别为 Male
的行:
awk '$3 == "Male" {print $1, $2}' data.txt
$3 == "Male"
表示查找第三列等于 “Male” 的行。print $1, $2
表示输出第一列和第二列。
输出结果:
John 25
Bob 22
5. 模式匹配(正则表达式)
awk
支持正则表达式,可以用于复杂的模式匹配。
awk '/Developer/ {print $1, $4}' data.txt
/Developer/
表示匹配包含 “Developer” 的行。print $1, $4
表示输出第一列和第四列。
输出结果:
John Developer
6. 内置变量
awk
提供了一些有用的内置变量来帮助处理文本:
NR
:当前记录(行)号(Number of Records)。NF
:当前行中的字段数(Number of Fields)。FS
:输入字段分隔符,默认是空白字符(Field Separator)。OFS
:输出字段分隔符,默认是空白字符(Output Field Separator)。
示例 1:打印行号
awk '{print NR, $0}' data.txt
NR
表示行号,$0
表示整行。
输出结果:
1 John 25 Male Developer
2 Alice 30 Female Manager
3 Bob 22 Male Designer
示例 2:打印每行的字段数
awk '{print $1, NF}' data.txt
NF
表示当前行的字段数。
输出结果:
John 4
Alice 4
Bob 4
7. 计算操作
awk
可以执行数学运算。例如,计算年龄加 1:
awk '{print $1, $2 + 1}' data.txt
输出结果:
John 26
Alice 31
Bob 23
8. BEGIN 和 END 块
- BEGIN 块:在处理输入的文件之前执行,可以用于初始化操作。
- END 块:在处理完文件后执行,可以用于总结性操作。
示例 1:打印文件的列标题
awk 'BEGIN {print "Name Age Gender Role"} {print $1, $2, $3, $4}' data.txt
输出结果:
Name Age Gender Role
John 25 Male Developer
Alice 30 Female Manager
Bob 22 Male Designer
示例 2:计算总的行数
awk 'END {print "Total lines:", NR}' data.txt
输出结果:
Total lines: 3
9. 修改输出格式
可以使用 printf
来格式化输出。
awk '{printf "%-10s %-5s %-8s %s\n", $1, $2, $3, $4}' data.txt
%s
表示字符串,%-10s
表示左对齐且宽度为 10 的字符串。
输出结果:
John 25 Male Developer
Alice 30 Female Manager
Bob 22 Male Designer
综合示例
假设你有一个包含销售数据的文件 sales.txt
:
Product,Price,Quantity
Laptop,800,2
Phone,400,5
Tablet,300,3
使用 awk
计算每行的总销售额(价格 * 数量):
awk -F ',' 'NR > 1 {print $1, $2 * $3}' sales.txt
NR > 1
跳过标题行。$2 * $3
计算每行的总销售额。
输出结果:
Laptop 1600
Phone 2000
Tablet 900
总结
awk
是一个强大的文本处理工具,特别适用于表格数据的处理。它支持字段处理、模式匹配、数学运算、格式化输出、内置变量等功能,可以简化许多文本处理任务。在日常工作中,awk
可以帮助你快速高效地处理大量数据。