📅  最后修改于: 2020-11-05 03:50:28             🧑  作者: Mango
AWK提供了几个内置变量。它们在编写AWK脚本时起着重要作用。本章演示了内置变量的用法。
标准AWK变量在下面讨论。
它表示在命令行中提供的参数数量。
例
[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four
在执行此代码时,您将获得以下结果-
输出
Arguments = 5
但是,当您仅传递4个参数时,为什么AWK显示5?只需检查以下示例即可清除您的疑问。
它是一个存储命令行参数的数组。数组的有效索引范围是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
它代表数字的转换格式。其默认值为%.6g 。
例
[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'
在执行此代码时,您将获得以下结果-
输出
Conversion Format = %.6g
它是环境变量的关联数组。
例
[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'
在执行此代码时,您将获得以下结果-
输出
jerry
要查找其他环境变量的名称,请使用env命令。
它代表当前文件名。
例
[jerry]$ awk 'END {print FILENAME}' marks.txt
在执行此代码时,您将获得以下结果-
输出
marks.txt
请注意,在BEGIN块中未定义FILENAME。
它表示(输入)字段分隔符,其默认值为空格。您也可以使用-F命令行选项来更改它。
例
[jerry]$ awk 'BEGIN {print "FS = " FS}' | cat -vte
在执行此代码时,您将获得以下结果-
输出
FS = $
它代表当前记录中的字段数。例如,以下示例仅打印包含两个以上字段的行。
例
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'
在执行此代码时,您将获得以下结果-
输出
One Two Three
One Two Three Four
它代表当前记录的编号。例如,下面的示例在当前记录号小于3的情况下打印记录。
例
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'
在执行此代码时,您将获得以下结果-
输出
One Two
One Two Three
它与NR类似,但相对于当前文件。当AWK对多个文件进行操作时,此功能很有用。 FNR的值用新文件重置。
它表示输出格式编号,其默认值为%.6g 。
例
[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'
在执行此代码时,您将获得以下结果-
输出
OFMT = %.6g
它代表输出字段分隔符,其默认值为空格。
例
[jerry]$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte
在执行此代码时,您将获得以下结果-
输出
OFS = $
它表示输出记录分隔符,其默认值为换行符。
例
[jerry]$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte
执行上述代码后,您将获得以下结果-
输出
ORS = $
$
它表示由match函数匹配的字符串的长度。 AWK的match函数在输入字符串中搜索给定的字符串。
例
[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'
在执行此代码时,您将获得以下结果-
输出
2
它表示(输入)记录分隔符,其默认值为换行符。
例
[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte
在执行此代码时,您将获得以下结果-
输出
RS = $
$
它表示匹配函数在字符串匹配的第一个位置。
例
[jerry]$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'
在执行此代码时,您将获得以下结果-
输出
9
它表示数组下标的分隔字符,其默认值为\ 034 。
例
[jerry]$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte
在执行此代码时,您将获得以下结果-
输出
SUBSEP = ^\$
它代表整个输入记录。
例
[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个字段,其中这些字段由FS分隔。
例
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
在执行此代码时,您将获得以下结果-
输出
Physics 80
Maths 90
Biology 87
English 85
History 89
GNU AWK特定变量如下-
它表示正在处理的当前文件在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
它用于为非POSIX系统上的所有文件I / O指定二进制模式。数值1、2或3分别指定输入文件,输出文件或所有文件应使用二进制I / O。 r或w的字符串值分别指定输入文件或输出文件应使用二进制I / O。 rw或wr的字符串值指定所有文件应使用二进制I / O。
当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
它提供了GAWK程序中–lint选项的动态控制。设置此变量后,GAWK将打印棉绒警告。当为字符串值分配致命错误时,棉绒警告将变成致命错误,就像–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
这是一个关联数组,其中包含有关进程的信息,例如真实和有效的UID编号,进程ID编号等。
例
[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'
在执行此代码时,您将获得以下结果-
输出
4316
它代表AWK程序的文本域。它用于查找程序字符串的本地化翻译。
例
[jerry]$ awk 'BEGIN { print TEXTDOMAIN }'
在执行此代码时,您将获得以下结果-
输出
messages
由于en_IN语言环境,以上输出显示了英文文本