简介
除了筛选和提取文本之外,awk 还是一种功能强大的文本处理语言,可以执行算术运算。它可以对列求和、计算平均值并统计出现次数,让你直接在命令行中生成报表和统计信息。
这也是 awk 数十年来一直很有价值的原因之一:许多运维任务都需要对文本文件进行轻量级报表处理,而 awk 无需完整的电子表格或独立的编程环境即可完成这些工作。
在本实验中,你将学习如何使用 awk:
- 初始化变量:使用
BEGIN块设置初始值。 - 执行计算:将每一行中的值相加,生成累计总数。
- 输出最终结果:使用
END块输出总数和汇总信息。 - 按条件计数:只统计符合特定条件的行。
初始化变量
开始计算前,通常需要先初始化变量。在 awk 中,BEGIN 块非常适合执行此操作,因为它会在处理任何行之前运行一次。
因此,BEGIN 通常用于初始化计数器、总数或标题等准备工作。它的作用与其他编程语言中的初始化代码相同。
查看数据文件 data.txt:
cat data.txt
该文件包含两列:Item($1)和 Quantity($2)。
接下来创建一个名为 total 的变量,并将其设置为 0。
运行以下命令:
awk 'BEGIN { total=0; print "Calculator ready. Total is initialized to:", total }' data.txt
命令执行过程:
awk执行BEGIN块。- 将变量
total设置为 0。 - 输出提示消息。
- 由于
BEGIN块后面没有主代码块,命令会在此停止(不过从技术上说,它已经准备好处理该文件)。
对列求和
现在处理该文件。我们要对第二列($2)中的值求和,这一列表示数量。
对于 awk 读取的每一行,都将 $2 加到变量 total 中。
加法赋值的语法是 total += $2,它是 total = total + $2 的简写形式。
这正是 awk 不只是列打印工具的地方。它会在遍历文件时保留状态,因此可以逐步生成总数和汇总信息,而不只是输出原始行。
运行以下命令,查看逐行计算过程:
awk 'BEGIN { total=0 } { total += $2; print "Added", $1, "("$2") - Current Total:", total }' data.txt
执行逻辑:
- BEGIN:将
total初始化为 0。 - 主循环:对于每一行,将数量(
$2)加到total中,并输出当前状态。
你会看到,随着每个项目被处理,累计总数不断增加。
输出最终结果
通常,你只需要最终总数,而不需要查看中间步骤。
此时可以使用 END 块。该代码块会在所有行处理完毕后运行一次。
因此,一个 awk 脚本通常分为三个阶段:使用 BEGIN 完成准备工作,使用主代码块处理每条记录,使用 END 输出最终报告。这种结构是高效使用 awk 时最重要的思维模型之一。
运行整理后的命令:
awk 'BEGIN { total=0 } { total += $2 } END { print "Final Total Quantity:", total }' data.txt
执行过程:
BEGIN:将total设置为 0。{ ... }:读取文件,将$2加到total中,但不输出任何中间信息。END:到达文件末尾后,输出total的最终值。
输出应为 Final Total Quantity: 22。
按条件计数
很多时候,你需要根据条件统计出现次数,而不是简单地对所有值求和。
例如:「有多少个项目的库存数量大于 4?」
- 初始化计数器(
count = 0)。 - 检查每一行:
if ($2 > 4)。 - 如果条件为真,则递增计数器:
count++。 - 在
END块中输出结果。
这个示例展示了 awk 如何在一次遍历文件的过程中,同时完成解析、条件判断和算术运算。对于许多运维报表来说,这意味着你不需要再使用其他语言编写独立程序。
运行计数命令:
awk 'BEGIN { count=0 } { if ($2 > 4) count++ } END { print "Items with quantity > 4:", count }' data.txt
结果应为 2(Apple 和 Cherry)。
你还可以组合使用这些逻辑。下面的命令只对大于 4 的值求和:
awk 'BEGIN { sum=0 } { if ($2 > 4) sum += $2 } END { print "Sum of quantities > 4:", sum }' data.txt
总和为 13(5 + 8)。
总结
在本实验中,你学习了如何使用 awk 进行计算和统计:
BEGIN块:在开始处理前初始化变量。- 算术运算(
+=):逐行执行列求和等计算。 - 条件语句(
if):仅在满足特定条件时执行逻辑,例如计数。 END块:文件处理完成后输出最终结果。
这些功能让你可以直接在终端中从文本文件生成复杂的数据汇总和指标。



