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

要找到其他的环境变量名称,使用GNU/Linux的env命令。

FILENAME

它代表了当前的文件名。

[jerry]$ awk 'END {print FILENAME}' marks.txt

在执行上面的代码后,得到以下结果:

marks.txt

请注意,FILENAME在BEGIN块中是未定义的。

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的匹配功能搜索输入字符串。

[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

它代表了当前记录,其中字段由FS分隔的第n个字段。

[jerry]$ awk '{print $3 "\t" $4}' marks.txt

在执行上面的代码后,得到以下结果:

Physics    80
Maths      90
Biology    87
English    85
History    89

GNU AWK specific variables

以下是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

它是用来指定二进制模式对所有文件I/O在非POSIX系统。 1,2,或3个数值,指定输入文件,输出文件或所有文件,分别应该使用二进制的I/O。字符串值r或w指定输入文件或输出文件,分别应该使用二进制的I/O。对rw orwr字符串值指定所有文件应使用二进制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是语言环境的英文文本。