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] = awkARGV[1] = oneARGV[2] = twoARGV[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 ThreeOne Two Three Four
NR
它表示当前记录的编号.例如,以下示例在当前记录编号小于3时打印记录.
示例
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'
执行此代码后,您将得到以下结果 :
输出
One TwoOne 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
它表示由匹配函数匹配的字符串的长度. AWK的匹配函数在输入字符串中搜索给定的字符串.
示例
[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'
执行此代码时,您将得到以下结果 :
输出
2
RS
它代表(输入)记录分隔符,其默认值为换行符.
示例
[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte
执行此代码时,您会得到以下结果 :
输出
RS = $$
RSTART
它代表匹配函数匹配的字符串中的第一个位置.
示例
[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 802) Rahul Maths 903) Shyam Biology 874) Kedar English 855) Hari History 89
$n
它表示当前记录中的n th 字段,其中字段由FS分隔.
示例
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
执行此代码后,即可获得以下结果 :
输出
Physics 80Maths 90Biology 87English 85History 89
GNU AWK特定变量
GNU AWK特定变量如下 :
ARGIND
它表示正在处理的当前文件的ARGV中的索引./p>
示例
[jerry]$ awk '{ print "ARGIND = ", ARGIND; print "Filename = ", ARGV[ARGIND] }' junk1 junk2 junk3
执行此代码后,您将得到以下结果 :
输出
ARGIND = 1Filename = junk1ARGIND = 2Filename = junk2ARGIND = 3Filename = junk3
BINMODE
它用于为非POSIX系统上的所有文件I/O指定二进制模式.数字值1,2或3分别指定输入文件,输出文件或所有文件应使用二进制I/O.字符串值 r 或 w 分别指定输入文件或输出文件应使用二进制I/O.字符串值 rw 或 wr 指定所有文件都应使用二进制I/O.
ERRNO
当 getline 重定向失败或关闭调用失败时,字符串表示错误.
示例
[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警告.当分配字符串值致命时,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
PROCINFO
这是一个关联数组,包含有关进程的信息,例如真实有效的UID号,进程ID号等.
示例
[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'
执行此代码后,您将获得以下结果 :
输出
4316
TEXTDOMAIN
它代表AWK程序的文本域.它用于查找程序字符串的本地化翻译.
示例
[jerry] $ awk'BEGIN {print TEXTDOMAIN}'
执行此代码后,您将得到以下结果 :
输出
messages
由于 en_IN 区域设置
,上述输出显示英文文本