摘要:五个实例就能让你学会强大的文本处理工具 awk 用法。
下面我将展示 awk 处理 users.txt 文件的五个实例,每个实例都包含详细解释。
示例文件users.txt内容:
alice:25:engineer
bob:30:designer
charlie:28:manager
diana:32:director
示例 1: 基础信息提取
awk -F':' '{
print "用户名: " $1, "年龄: " $2, "职位: " $3
}' users.txt
输出结果:
用户名: alice 年龄: 25 职位: engineer
用户名: bob 年龄: 30 职位: designer
用户名: charlie 年龄: 28 职位: manager
用户名: diana 年龄: 32 职位: director
参数解释:
-F':' :设置字段分隔符为冒号
$1, $2, $3 :分别表示第一、二、三列
print :输出格式化内容
示例 2: 条件筛选(年龄大于28岁的用户)
awk -F':' '$2 > 28 {
print $1 " 是 " $3 ",年龄 " $2 "(超过28岁)"
}' users.txt
输出结果:
bob 是 designer,年龄 30(超过28岁)
diana 是 director,年龄 32(超过28岁)
关键点:
$2 > 28:条件表达式(筛选第二列大于28的行)
只有符合条件的行才会执行后面的 {...} 操作
示例 3: 计算统计(平均年龄)
awk -F':' '
BEGIN {
total = 0; count = 0; print "开始计算年龄..."
}
{
total += $2;
count++;
print "已处理: " $1
}
END {
avg = total/count;
print "\n用户总数: " count
print "年龄总和: " total
print "平均年龄: " avg
}' users.txt
输出结果:
开始计算年龄...
已处理: alice
已处理: bob
已处理: charlie
已处理: diana
用户总数: 4
年龄总和: 115
平均年龄: 28.75
解释:
BEGIN {}:在处理任何行之前执行
END {}:在处理完所有行之后执行
total += $2:累加年龄值
count++:行计数器
示例 4: 字段重组(生成报告)
awk -F':' '
{
#创建用户信息对象
user_info = sprintf("用户 %s (%s),年龄 %d", $1, $3, $2)
#根据年龄添加标签
if ($2 > 30) {
tag = "[资深]"
} else if ($2 > 25) {
tag = "[中级]"
} else {
tag = "[初级]"
}
#输出格式化结果
printf "%-5d: %-35s %s\n", NR, user_info, tag
}' users.txt
输出结果:
1 : 用户 alice (engineer),年龄 25 [初级]
2 : 用户 bob (designer),年龄 30 [中级]
3 : 用户 charlie (manager),年龄 28 [中级]
4 : 用户 diana (director),年龄 32 [资深]
参数解释:
sprintf():格式化字符串
printf:控制输出格式
%-5d:左对齐的5位宽整数
NR:内置行号变量
条件判断语句:if...else if...else
示例 5: 字段修改(年龄+5并转换大写)
awk -F':' -v OFS=':' '{
$2 = $2 + 5 #年龄增加5岁
$3 = toupper($3) #职位转为大写
print $0 #输出修改后的行
}' users.txt > updated_users.txt
修改后的文件内容:
alice:30:ENGINEER
bob:35:DESIGNER
charlie:33:MANAGER
diana:37:DIRECTOR
参数说明:
-v OFS=':': 设置输出字段分隔符
toupper(): 字符串转大写函数
$2 = $2 + 5: 修改第二列值
> updated_users.txt:结果重定向到新文件