每日Linux学习:五个实例学会强大的文本处理工具awk

摘要:五个实例就能让你学会强大的文本处理工具 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:结果重定向到新文件


总结

原文链接:,转发请注明来源!