AWK 内建变量
AWK提供了几个内建变量。在编写AWK脚本时,它们扮演着重要的角色。本章演示了内建变量的使用方法。
标准AWK变量
下面讨论了标准AWK变量。
ARGC
它表示在命令行提供的参数数量。
示例
[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four
执行此代码后,您将得到以下结果−
输出
Arguments = 5
但为什么当你只传递 4 个参数时,AWK 显示 5 呢?只需查看以下示例以消除疑惑。
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 命令。
文件名
它表示当前文件名。
示例
[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
它代表当前记录的编号。例如,下面的示例会在当前记录编号小于三的情况下打印记录。
示例
[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 =
开始位置
它表示由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 '{print0}' 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 '{print3 "\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
字段宽度
当设置了一个以空格分隔的字段宽度变量时,GAWK会将输入解析为固定宽度的字段,而不是使用FS变量的值作为字段分隔符。
忽略大小写
当设置了这个变量时,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本地化。