5.0 掌握 AWK 的内置变量
5.1 内置变量的作用
内置变量是 AWK 的一项关键特性,它能够自动访问有关输入数据、执行环境和程序状态的信息。熟练掌握内置变量的使用对于编写强大、简洁且符合 AWK 规范的脚本至关重要。
5.2. 标准 AWK 变量
- ARGC 和 ARGV ARGC 包含命令行参数的数量,而 ARGV 是一个包含参数本身的数组。请注意,ARGV[0] 保存的是命令名称,即 awk。
- NF(字段数) 该变量保存当前记录中的字段总数。每次读取记录时都会重新计算该变量。
- NR(记录编号) 该变量充当全局计数器,存储自脚本开始运行以来已处理的记录的累计数量。
- FNR(文件记录编号) 与 NR 类似,FNR 也存储记录号,但对于每个新处理的输入文件,它都会重置为 1。这使得它在多文件操作中非常有用。例如,考虑两个文件:data1.txt 包含 A\nB,data2.txt 包含 C\nD。
- 请注意,对于 data2.txt,FNR 重置为 1,而 NR 继续递增。
- FS(场分离器) 定义用于分隔输入记录中各个字段的字符或正则表达式。默认值为空格(一个或多个空格或制表符)。
- RS(记录分隔符) 定义用于分隔输入记录的字符。默认值为换行符(\n)。
- OFS(输出场分离器) 定义在使用带多个参数的 print 语句时,输出结果中各字段之间的分隔符。默认值为单个空格。
- ORS(输出记录分隔符) 定义输出中每条记录末尾的分隔符。默认值为换行符(\n)。
- 文件名 该变量保存当前正在处理的输入文件的名称。
- **$0 和 n** 如前所述,`0` 表示整个当前记录,而`n`(例如,`1, $2`)表示该记录中的第 n 个字段。
- RSTART 和 RLENGTH 与 match() 函数一起使用。匹配成功后,RSTART 保存匹配子字符串的起始位置(索引),RLENGTH 保存其长度。
- CONVFMT 和 OFMT 这些变量控制将数字转换为字符串的格式 (CONVFMT) 和打印数字的输出格式 (OFMT)。两者的默认值均为 %.6g。
- 分会 此变量指定用于模拟多维数组的下标分隔符。默认值为不可打印字符 \034。
- 环保 一个关联数组,用于访问 shell 的环境变量。
5.3. GNU AWK (GAWK) 特定变量
GAWK 通过其自身的一组内置变量,为 POSIX 标准提供了几个扩展。
- 阿尔金:ARGV 数组中指向当前正在处理的文件的索引。
- 忽略案例:如果设置为非零值,则对所有正则表达式操作启用不区分大小写的模式匹配。
- 错误号当重定向或 close() 操作失败时,此变量包含一个与系统相关的错误消息字符串。
- 场宽:一个以空格分隔的数字列表,指示 GAWK 根据固定的字段宽度解析记录,而不是使用 FS 变量。
- 皮棉:提供对代码检查的动态控制。启用此选项后,将发出有关不兼容或有问题的代码结构的警告。
- 信息:一个关联数组,包含有关正在运行的进程的信息,例如其进程 ID (PROCINFO[“pid”])。
- 文本域:用于国际化,指定用于检索本地化程序字符串的文本域。
- 二进制模式:用于非 POSIX 系统,以指定文件 I/O 操作的二进制模式。
现在我们已经了解了 AWK 如何通过变量存储和提供对数据的访问,接下来合乎逻辑的步骤就是探索用于操作这些数据的运算符。