今天我们要聊的是 Linux 文本处理三剑客中的另一位重量级选手——awk。如果说上期讲的 sed 是擅长"行"编辑的流水线工人,那 awk 就是擅长"列"处理的表格专家。它特别适合处理像成绩单、日志、CSV 这种有规律的结构化数据。
AWK 的核心逻辑:按列切割
awk 的基本工作流程是:逐行读取文本,然后按指定的分隔符(默认是空格)把每一行切分成若干列(字段)。切分后,你可以精准地对第 1 列、第 2 列进行操作。
基本语法
awk 'pattern {action}' filename参数说明
关键变量符号
| 符号 | 含义 |
|---|
$1 | 代表第一列 |
$2 | 代表第二列 |
$0 | 代表整行 |
NR | 当前行号 |
NF | 当前行的列数 |
教师办公实战场景
示例数据文件 score.txt
张三 数学 85李四 数学 92王五 数学 78
场景 1:快速提取特定列(制作名单)
你只需要所有学生的姓名(第一列),不需要科目和分数:
awk'{print $1}' score.txt输出:
张三李四王五
💡 解析:{print $1} 表示对每一行,只打印第一列的内容。
场景 2:自定义分隔符(处理 CSV/表格)
如果你的数据是用逗号分隔的(如 Excel 导出的 CSV):
awk-F',''{print $1, $3}' data.csv💡 解析:-F',' 参数告诉 awk 使用逗号作为分隔符,而不是默认的空格。
场景 3:条件筛选(找出及格的学生)
假设第三列是分数,你想筛选出及格(≥60)的学生:
awk'$3 >= 60 {print $1, "及格"}' score.txt💡 解析:$3 >= 60 是条件,只有满足该条件的行,才会执行后面的打印动作。
场景 4:简单统计(计算平均分)
想快速知道班级平均分,不用打开 Excel:
awk'{sum += $3} END {print "平均分:", sum/NR}' score.txt💡 解析:sum += $3 累加第三列分数;END 是在处理完所有行后执行,NR 是总行数。
AWK 与 SED 的选用指南
很多同学会混淆 awk 和 sed,记住这个原则:
| 工具 | 使用场景 |
|---|
| sed | 当你需要对文本内容进行查找、替换、删除(如把"错误"替换为"警告"),或者进行整行的插入、追加操作时。 |
| awk | 当你面对的是表格状数据,需要按列提取、统计、计算(如提取日志中的 IP 地址、计算成绩总和)时。 |
今日小结
awk 的核心就是"列"。记住 -F 设置分隔符,$1 代表第一列,$NF 代表最后一列,你就能解决 80% 的日常数据处理问题。
下次当你拿到一堆杂乱无章的日志或数据文件时,别再手动复制粘贴了,试试 awk 吧!
如果你有特别想学的某个命令,欢迎在评论区留言。我们下期见!