awk
是一个强大的文本处理工具和编程语言,专门用于处理和解析文本文件。它以行和列的形式处理文本,并提供了强大的模式匹配和报告生成能力。awk
得名于其创建者 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的名字。
文章目录
基本语法
awk 'pattern { action }' file
pattern
:可选的模式,用于匹配行。action
:对匹配行要执行的操作。如果未指定动作,awk
将默认打印所有匹配行。
常用选项
-F
:指定输入字段分隔符。-v
:定义变量。-f
:从文件读取脚本。
基本操作
-
打印特定字段
如果有一个文件
data.txt
的内容如下:Alice 30 female Bob 25 male Carol 28 female
打印文件的第二列(年龄):
awk '{ print $2 }' data.txt
输出:
30 25 28
-
指定字段分隔符
若文件内容为 CSV 格式:
name,age,gender Alice,30,female Bob,25,male Carol,28,female
使用逗号作为字段分隔符并打印第一和第三列:
awk -F ',' '{ print $1, $3 }' data.csv
输出:
name gender Alice female Bob male Carol female
-
使用模式匹配
仅打印年龄大于 26 的行:
awk '$2 > 26 { print $1, $2 }' data.txt
输出:
Alice 30 Carol 28
-
使用内置变量
打印行号:
awk '{ print NR, $0 }' data.txt
输出:
1 Alice 30 female 2 Bob 25 male 3 Carol 28 female
常见模式和操作
-
条件语句
使用条件语句进行复杂判断:
awk '{ if ($2 > 25) print $1 " is older than 25." }' data.txt
-
累加和计算
计算年龄的总和:
awk '{ sum += $2 } END { print sum }' data.txt
计算平均年龄:
awk '{ sum += $2; count++ } END { print sum/count }' data.txt
-
输出格式化
格式化输出:
awk '{ printf "%-10s %s\n", $1, $2 }' data.txt
高级用法
-
从文件读取脚本
将以下内容保存为
script.awk
:{ if ($2 > 26) { print $1 " is older than 26." } }
在命令行中调用:
awk -f script.awk data.txt
-
使用变量
awk -v age=30 '$2 > age { print $1 " is older than " age }' data.txt
-
报告生成
生成简单的报告:
awk -F ',' 'NR > 1 { age_sum += $2; count++ } END { printf "Average age: %.2f\n", age_sum/count }' data.csv
文件处理示例
示例 1: 统计文件中的行数
awk 'END { print NR }' data.txt
示例 2: 查找特定文本
查找包含 “female” 的行:
awk '/female/ { print $0 }' data.txt
示例 3: 计算字段总和
如果你有一个包含价格的文件 prices.txt
:
10.5
20.0
15.75
计算总和:
awk '{ total += $1 } END { print total }' prices.txt
当然可以!下面是一些具体的 awk
实例,涵盖常见用法和复杂操作,以帮助你更好地理解和使用 awk
。
示例 1: 打印特定字段
假设有一个文件 data.txt
,内容如下:
Alice 30 female
Bob 25 male
Carol 28 female
-
打印第二列(年龄):
awk '{ print $2 }' data.txt
输出:
30 25 28
-
打印第一列(名字)和第三列(性别):
awk '{ print $1, $3 }' data.txt
输出:
Alice female Bob male Carol female
示例 2: 使用不同分隔符
假设有一个 CSV 文件 data.csv
,内容如下:
name,age,gender
Alice,30,female
Bob,25,male
Carol,28,female
- 使用逗号作为字段分隔符,打印第一和第三列:
输出:awk -F ',' '{ print $1, $3 }' data.csv
name gender Alice female Bob male Carol female
示例 3: 条件语句
-
打印年龄大于 26 的行:
awk '$2 > 26 { print $1, $2 }' data.txt
输出:
Alice 30 Carol 28
-
打印性别为 ‘female’ 的行:
awk '$3 == "female" { print $1 }' data.txt
输出:
Alice Carol
示例 4: 使用内置变量
-
打印行号和行内容:
awk '{ print NR, $0 }' data.txt
输出:
1 Alice 30 female 2 Bob 25 male 3 Carol 28 female
-
统计总行数:
awk 'END { print NR }' data.txt
输出:
3
示例 5: 计算和平均值
-
计算年龄总和:
awk '{ sum += $2 } END { print sum }' data.txt
输出:
83
-
计算平均年龄:
awk '{ sum += $2; count++ } END { print sum/count }' data.txt
输出:
27.6667
示例 6: 输出格式化
- 格式化输出:
输出:awk '{ printf "%-10s %s\n", $1, $2 }' data.txt
Alice 30 Bob 25 Carol 28
示例 7: 查找特定文本
在文件 log.txt
中,假设内容如下:
INFO: User Alice logged in
ERROR: Bob failed to log in
INFO: Carol logged out
WARN: Bob takes too long to login
-
查找包含 ‘ERROR’ 的行:
awk '/ERROR/ { print $0 }' log.txt
输出:
ERROR: Bob failed to log in
-
从每行提取用户的名字:
awk '/User|failed/ { print $3 }' log.txt
输出:
Alice Bob
示例 8: 复杂操作公式
-
计算各列的最大值(假设每一行有多个数值):
awk '{ for (i=1; i<=NF; i++) { if ($i > max[i]) { max[i] = $i; } } } END { for (i=1; i<=NF; i++) { print "Max for column " i ": " max[i]; } }' numbers.txt
-
统计每个用户的登录次数:
awk '{ count[$3]++ } END { for (user in count) print user ": " count[user] }' log.txt
示例 9: 使用用户名作为字段
将用户信息存储在 users.txt
中:
username:password:uid:gid:description
user1:pass1:1001:1001:User One
user2:pass2:1002:1001:User Two
user3:pass3:1003:1002:User Three
- 打印用户名和描述:
输出:awk -F ':' '{ print $1, $5 }' users.txt
username description user1 User One user2 User Two user3 User Three
示例 10: 从文件读取脚本
如果你有一个脚本 script.awk
,内容如下:
{
if ($2 > 25) {
print $1 " is older than 25."
}
}
使用以下命令调用它:
awk -f script.awk data.txt
示例 11: 使用 -v
选项定义变量
awk -v threshold=25 '$2 > threshold { print $1 " is older than " threshold }' data.txt
示例 12: 结合其他命令
-
查找某个词并计算行数:
grep "Alice" data.txt | awk '{ print $1 }'
-
统计文件中不同名字的数量:
cut -d ' ' -f 1 data.txt | sort | uniq | wc -l
示例 13: 处理多个文件
假设有多个文件 data1.txt
和 data2.txt
,共同格式如下:
cat data*.txt | awk '{ print $1, $2 }' # 打印每个文件的前两列
示例 14: 通过 FIELDWIDTHS 使用定宽字段
如果文件 fixed_width.txt
是这样的:
Alice 30 female
Bob 25 male
Carol 28 female
可以使用FIELDWIDTHS
来处理固定宽度的字段:
awk 'BEGIN { FIELDWIDTHS = "10 3 6" } { print $1, $2 }' fixed_width.txt
示例 15: 输出到文件
将计算结果输出到文件:
awk '{ print $1, $2 }' data.txt > output.txt
总结
awk
是一个强大且灵活的文本处理工具。无论是简单的列提取,还是复杂的数据处理和报告生成,awk
都能高效地完成。