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 命令。

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

它表示当前记录中的第 nth 字段,其中字段由 FS 分隔。

示例

[jerry]$ awk '{print $3 "\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。rw 的字符串值分别指定输入文件或输出文件应使用二进制 I/O。rwwr 的字符串值指定所有文件都应使用二进制 I/O。

ERRNO

getline 的重定向失败或 close 调用失败时,字符串指示错误。

示例

[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 警告。 当赋予字符串值 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 语言环境,上述输出显示英文文本