AWK提供了几个内置变量。他们发挥着重要的作用,同时编写AWK脚本。本章说明了内置变量的使用。
以下是标准AWK变量:
这意味着在命令行提供参数的个数。
[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four
在执行上面的代码后,得到以下结果:
Arguments = 5
这程序有什么问题?为什么AWK是显示5时,只传过4个参数。只要看看下面的例子就清楚了。
它是存储在命令行参数的数组。数组的有效索引范围是从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
要找到其他的环境变量名称,使用GNU/Linux的env命令。
它代表了当前的文件名。
[jerry]$ awk 'END {print FILENAME}' marks.txt在执行上面的代码后,得到以下结果:
marks.txt
请注意,FILENAME在BEGIN块中是未定义的。
它代表了(输入)字段分隔符以及它的默认值是空格。也可以通过-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
它表示当前记录的编号。比如下面的例子打印记录,如果当前记录包含少于三个字段
[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的匹配功能搜索输入字符串。
[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'在执行上面的代码后,得到以下结果:
2
它表示(输入)记录分隔符以及它的默认值是换行。
[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte在执行上面的代码后,得到以下结果:
RS = $ $
它表示匹配match函数字符串中的第一个位置。
[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
它代表了当前记录,其中字段由FS分隔的第n个字段。
[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
它是用来指定二进制模式对所有文件I/O在非POSIX系统。 1,2,或3个数值,指定输入文件,输出文件或所有文件,分别应该使用二进制的I/O。字符串值r或w指定输入文件或输出文件,分别应该使用二进制的I/O。对rw orwr字符串值指定所有文件应使用二进制I/O。
一个字符串,指示错误时重定向失败函数getline或者接近调用失败。
[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警告。当指定的字符串值是致命的,lint警告成为致命错误,类似--lint=致命的。
[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是语言环境的英文文本。