AWK 内建变量

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

文件名

它表示当前文件名。

示例

[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 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的match函数在输入字符串中搜索给定的字符串。

示例

[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'

执行此代码,你会得到以下结果:

输出:

2

RS

它代表(输入)记录分隔符,其默认值为换行符。

示例

[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte

执行此代码时,您将获得以下结果−

输出

RS = 

开始位置

它表示由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 '{print0}' marks.txt

执行此代码后,您将获得以下结果:

输出

1) Amit     Physics   80
2) Rahul    Maths     90
3) Shyam    Biology   87
4) Kedar    English   85
5) Hari     History   89

$n

它表示当前记录中第n 个字段,字段由FS分隔。

示例

[jerry]awk '{print3 "\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

当重定向失败时, getlineclose 调用失败时,字符串指示错误。

示例

[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

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本地化。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程