3.0 核心概念:AWK 工作流程和程序结构
3.1 “读取、执行、重复”工作流程
AWK 的基本处理模型是一个简单而强大的循环,使其在逐行文本分析方面异常高效。这种“读取、执行、重复”的工作流程是驱动所有 AWK 程序的核心引擎,从简单的单行代码到复杂的脚本都离不开它。
该工作流程由三个不同的阶段组成,这些阶段循环往复,直到所有输入都被消耗完毕:
- 阅读: AWK 从输入流(可以是文件、来自其他命令的管道或标准输入)读取一行,并将其存储在内存中。
- 执行: 然后,它会将所有指定的命令和模式应用于该行。默认情况下,命令会在每一行执行,但可以使用模式将执行限制为仅针对符合特定条件的行。
- 重复: 对后续每一行都重复此过程,直到到达输入流的末尾。
3.2 AWK程序的结构
AWK 程序由三个可选模块构成,每个模块都设计在程序生命周期的不同阶段执行。这种结构允许在处理之前进行初始化,在处理过程中执行逐行操作,并在处理完成后生成最终报告。这些模块与上述工作流程直接对应。
- 此 BEGIN 块:
- 语法: 开始 { awk 命令 }
- 目的: 此代码块只会执行一次。 before “读取、执行、重复”循环开始。它是执行诸如初始化变量、打印报表标题或设置配置选项等任务的理想位置。此循环是可选的。
- 此 Body 块:
- 语法: /pattern/ { awk-commands }
- 目的: 这是核心处理模块,代表“执行”阶段。 内 主循环会针对每一行输入执行。如果指定了模式,则代码块的命令仅对匹配该模式的行执行。如果省略模式,则代码块会对所有行执行。 每周 输入行。
- 此 END 块:
- 语法: 结束 { awk 命令 }
- 目的: 此代码块只会执行一次。 后 “读取、执行、重复”循环已终止。它通常用于最终计算,例如计算总计或平均值,以及打印汇总报告或页脚。它也是可选的。
为了说明这些概念,请考虑一个名为 marks.txt 的文件,其中包含学生记录。
输入文件:marks.txt
1) Amit 物理 80
2) Rahul Maths 90
3) Shyam 生物学 87
4) Kedar English 85
5)哈里历史89
以下命令使用 BEGIN 块打印格式化的标头,并使用 Body 块打印文件的每一行。
AWK 命令:
[jerry]$ awk 'BEGIN{printf “序号\t姓名\t科目\t分数\n”} {print}' marks.txt
最终输出:
序号 名称 子商标
1) Amit 物理 80
2) Rahul Maths 90
3) Shyam 生物学 87
4) Kedar English 85
5)哈里历史89
首先执行 BEGIN 代码块,打印文件头。然后,对于 marks.txt 文件中的每一行,执行 Body 代码块的 {print} 命令,将该行内容打印到标准输出。有了这个结构基础,我们现在可以探索调用 AWK 程序的实际机制,无论是作为简单的命令行过滤器,还是作为强大且可重用的脚本。