awk
是一个强大的文本处理工具,广泛用于分析和处理结构化文本数据。以下是 awk
的用法详解,包括基本语法、常用选项和实际应用示例。
基本语法
awk 'pattern {action}' file
- pattern:模式匹配,可以是条件、正则表达式或范围。
- action:对匹配行执行的操作(如打印、计算)。
- file:输入文件。
如果省略 pattern
,默认匹配所有行;如果省略 action
,默认执行 print $0
(输出整行)。
awk
内置变量
变量 | 描述 |
---|---|
$0 | 当前行的全部内容。 |
$1, $2... | 当前行的第 1 列、第 2 列……,默认以空格或制表符分隔。 |
NR | 当前行号。 |
NF | 当前行的字段数。 |
FS | 输入字段分隔符,默认是空格或制表符。 |
OFS | 输出字段分隔符,默认是空格。 |
RS | 输入行分隔符,默认是换行符。 |
ORS | 输出行分隔符,默认是换行符。 |
FILENAME | 当前处理的文件名。 |
常用选项
选项 | 作用 |
---|---|
-F | 指定字段分隔符。 |
-v var=val | 定义用户变量。 |
-f script | 从脚本文件中读取 awk 程序。 |
示例详解
1. 打印文件的特定列
awk '{print $1, $3}' file.txt
- 打印文件中每行的第 1 列和第 3 列。
2. 指定字段分隔符
awk -F',' '{print $1, $3}' file.csv
- 使用逗号
,
作为分隔符,打印第 1 列和第 3 列。
3. 条件筛选
示例 1:筛选特定行
awk '$2 > 25 {print $0}' file.txt
- 筛选第 2 列大于 25 的行。
示例 2:正则表达式匹配
awk '/Alice/ {print $0}' file.txt
- 筛选包含
Alice
的行。
4. 统计行数和字段数
示例 1:统计行数
awk 'END {print NR}' file.txt
- 输出文件的总行数。
示例 2:统计每行字段数
awk '{print "Line " NR ": " NF " fields"}' file.txt
5. 计算字段的总和
awk '{sum += $2} END {print "Total:", sum}' file.txt
- 计算第 2 列的总和。
6. 修改分隔符
示例 1:改变输入字段分隔符
awk -F':' '{print $1, $3}' /etc/passwd
- 以冒号
:
为分隔符,打印第 1 列和第 3 列。
示例 2:改变输出字段分隔符
awk -F',' 'BEGIN {OFS="|"} {print $1, $2}' file.csv
- 使用逗号作为输入分隔符,输出用竖线
|
分隔。
7. 使用变量
示例 1:通过命令行传递变量
awk -v threshold=25 '$2 > threshold {print $0}' file.txt
- 使用变量
threshold
,筛选第 2 列大于 25 的行。
示例 2:在脚本中定义变量
awk 'BEGIN {x=10; print x*2}'
- 输出
20
。
8. 输出行号和文件名
awk '{print FILENAME, NR, $0}' file.txt
- 打印文件名、行号和行内容。
9. 多文件处理
awk '{print FILENAME, $0}' file1.txt file2.txt
- 同时处理多个文件,每行显示文件名和内容。
10. 高级应用:统计与分组
示例 1:统计每个名称的次数
awk '{count[$1]++} END {for (name in count) print name, count[name]}' file.txt
示例 2:按组统计总和
awk '{sum[$1] += $2} END {for (name in sum) print name, sum[name]}' file.txt