- AWK 教程
- AWK - 首页
- AWK - 概述
- AWK - 环境
- AWK - 工作流程
- AWK - 基本语法
- AWK - 基本示例
- AWK - 内建变量
- AWK - 运算符
- AWK - 正则表达式
- AWK - 数组
- AWK - 控制流
- AWK - 循环
- AWK - 内建函数
- AWK - 用户自定义函数
- AWK - 输出重定向
- AWK - 美化输出
- AWK 有用资源
- AWK - 快速指南
- AWK - 有用资源
- AWK - 讨论
AWK - 内建变量
AWK 提供了一些内置变量。它们在编写 AWK 脚本时起着重要作用。本章演示了内置变量的用法。
标准 AWK 变量
下面讨论标准 AWK 变量。
ARGC
它表示在命令行中提供的参数数量。
示例
[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four
执行此代码后,您将获得以下结果:
输出
Arguments = 5
但是为什么 AWK 显示 5 而您只传递了 4 个参数呢?请查看以下示例以消除您的疑问。
ARGV
它是一个存储命令行参数的数组。数组的有效索引范围从 0 到 ARGC-1。
示例
[jerry]$ awk 'BEGIN {
for (i = 0; i < ARGC - 1; ++i) {
printf "ARGV[%d] = %s\n", i, ARGV[i]
}
}' one two three four
执行此代码后,您将获得以下结果:
输出
ARGV[0] = awk ARGV[1] = one ARGV[2] = two ARGV[3] = three
CONVFMT
它表示数字的转换格式。其默认值为 %.6g。
示例
[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'
执行此代码后,您将获得以下结果:
输出
Conversion Format = %.6g
ENVIRON
它是一个环境变量的关联数组。
示例
[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'
执行此代码后,您将获得以下结果:
输出
jerry
要查找其他环境变量的名称,请使用 env 命令。
FILENAME
它表示当前文件名。
示例
[jerry]$ awk 'END {print FILENAME}' marks.txt
执行此代码后,您将获得以下结果:
输出
marks.txt
请注意,在 BEGIN 代码块中 FILENAME 未定义。
FS
它表示(输入)字段分隔符,其默认值为空格。您也可以使用 -F 命令行选项更改此值。
示例
[jerry]$ awk 'BEGIN {print "FS = " FS}' | cat -vte
执行此代码后,您将获得以下结果:
输出
FS = $
NF
它表示当前记录中的字段数。例如,以下示例仅打印包含两个以上字段的行。
示例
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'
执行此代码后,您将获得以下结果:
输出
One Two Three One Two Three Four
NR
它表示当前记录的编号。例如,以下示例在当前记录号小于 3 时打印记录。
示例
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'
执行此代码后,您将获得以下结果:
输出
One Two One Two Three
FNR
它类似于 NR,但相对于当前文件。当 AWK 操作多个文件时,它很有用。FNR 的值在新的文件中重置。
OFMT
它表示输出格式数字,其默认值为 %.6g。
示例
[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'
执行此代码后,您将获得以下结果:
输出
OFMT = %.6g
OFS
它表示输出字段分隔符,其默认值为空格。
示例
[jerry]$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte
执行此代码后,您将获得以下结果:
输出
OFS = $
ORS
它表示输出记录分隔符,其默认值为换行符。
示例
[jerry]$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte
执行上述代码后,您将获得以下结果:
输出
ORS = $ $
RLENGTH
它表示由 match 函数匹配的字符串的长度。AWK 的 match 函数在输入字符串中搜索给定的字符串。
示例
[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'
执行此代码后,您将获得以下结果:
输出
2
RS
它表示(输入)记录分隔符,其默认值为换行符。
示例
[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte
执行此代码后,您将获得以下结果:
输出
RS = $ $
RSTART
它表示由 match 函数匹配的字符串中的第一个位置。
示例
[jerry]$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'
执行此代码后,您将获得以下结果:
输出
9
SUBSEP
它表示数组下标的分隔符字符,其默认值为 \034。
示例
[jerry]$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte
执行此代码后,您将获得以下结果:
输出
SUBSEP = ^\$
$0
它表示整个输入记录。
示例
[jerry]$ awk '{print $0}' marks.txt
执行此代码后,您将获得以下结果:
输出
1) Amit Physics 80 2) Rahul Maths 90 3) Shyam Biology 87 4) Kedar English 85 5) Hari History 89
$n
它表示当前记录中的第 n 个字段,其中字段由 FS 分隔。
示例
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
执行此代码后,您将获得以下结果:
输出
Physics 80 Maths 90 Biology 87 English 85 History 89
GNU AWK 特定变量
GNU AWK 特定变量如下:
ARGIND
它表示正在处理的当前文件在 ARGV 中的索引。
示例
[jerry]$ awk '{
print "ARGIND = ", ARGIND; print "Filename = ", ARGV[ARGIND]
}' junk1 junk2 junk3
执行此代码后,您将获得以下结果:
输出
ARGIND = 1 Filename = junk1 ARGIND = 2 Filename = junk2 ARGIND = 3 Filename = junk3
BINMODE
它用于在非 POSIX 系统上为所有文件 I/O 指定二进制模式。1、2 或 3 的数值分别指定输入文件、输出文件或所有文件应使用二进制 I/O。字符串值 r 或 w 分别指定输入文件或输出文件应使用二进制 I/O。字符串值 rw 或 wr 指定所有文件应使用二进制 I/O。
ERRNO
当重定向 getline 失败或 close 调用失败时,一个字符串指示错误。
示例
[jerry]$ awk 'BEGIN { ret = getline < "junk.txt"; if (ret == -1) print "Error:", ERRNO }'
执行此代码后,您将获得以下结果:
输出
Error: No such file or directory
FIELDWIDTHS
如果设置了以空格分隔的字段宽度变量列表,则 GAWK 会将输入解析为固定宽度的字段,而不是使用 FS 变量的值作为字段分隔符。
IGNORECASE
当设置此变量时,GAWK 会不区分大小写。以下示例演示了这一点:
示例
[jerry]$ awk 'BEGIN{IGNORECASE = 1} /amit/' marks.txt
执行此代码后,您将获得以下结果:
输出
1) Amit Physics 80
LINT
它提供对 GAWK 程序中 --lint 选项的动态控制。当设置此变量时,GAWK 会打印 lint 警告。当分配字符串值 fatal 时,lint 警告会变成致命错误,与 --lint=fatal 完全相同。
示例
[jerry]$ awk 'BEGIN {LINT = 1; a}'
执行此代码后,您将获得以下结果:
输出
awk: cmd. line:1: warning: reference to uninitialized variable `a' awk: cmd. line:1: warning: statement has no effect
PROCINFO
这是一个关联数组,包含有关进程的信息,例如真实和有效 UID 号、进程 ID 号等。
示例
[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'
执行此代码后,您将获得以下结果:
输出
4316
TEXTDOMAIN
它表示 AWK 程序的文本域。它用于查找程序字符串的本地化翻译。
示例
[jerry]$ awk 'BEGIN { print TEXTDOMAIN }'
执行此代码后,您将获得以下结果:
输出
messages
由于 en_IN 区域设置,以上输出显示英文文本