93. GAWK 内置环境变量


本节中讨论的内置变量仅在 GAWK 中可用。

当您想要访问 awk 脚本中的 shell 环境变量时,这非常有用。 是一个包含所有环境值的数组。 ENVIRON 数组的索引是环境变量名称。

例如,数组元素 ENVIRON["PATH"] 将包含 PATH 环境变量的值。 以下示例打印所有可用的环境变量及其值。

$ cat environ.awk
BEGIN {
    OFS="="
    for(x in ENVIRON)
    print x,ENVIRON[x];
}

$ awk -f environ.awk
SHELL=/bin/bash
PATH=/home/ramesh/bin:/usr/local/sbin:/usr/local/bin:/u
sr/sbin:/usr/bin:/sbin:/bin:/usr/games
HOME=/home/ramesh
TERM=xterm
USERNAME=ramesh
DISPLAY=:0.0
AWKPATH=.:/usr/share/awk

默认情况下 IGNORECASE 设置为 0。因此,awk 程序区分大小写。

当您将 IGNORECASE 设置为 1 时,awk 程序变得不区分大小写。这将影响正则表达式和字符串比较。

以下内容不会打印任何内容,因为它正在寻找带有小写 "v""video"。 但是,「items.txt」 文件仅包含带有大写 "V""Video"

awk '/video/ {print}' items.txt

但是,当您将 IGNORECASE 设置为 1 并搜索 "video" 时,它将打印包含 "Video" 的行,因为它不会进行区分大小写的模式匹配。

$ awk 'BEGIN{IGNORECASE=1} /video/ {print}' items.txt
101,HD Camcorder,Video,210,10

正如您在下面的示例中看到的,这适用于字符串和正则表达式比较。

$ cat ignorecase.awk
BEGIN {
    FS=",";
    IGNORECASE=1;
}
{
    if ($3 == "video") print $0;
    if ($2 ~ "TENNIS") print $0;
}

$ awk -f ignorecase.awk items.txt
101,HD Camcorder,Video,210,10
104,Tennis Racket,Sports,190,20

当使用 I/O 操作(例如:getline)时出现错误时, ERRNO 变量将包含相应的错误消息。

以下示例尝试使用 getline 读取不存在的文件。在这种情况下, ERRNO 变量将包含 "No such file or directory" 消息。

$ vi errno.awk
{
    print $0;
    x = getline < "dummy-file.txt"
    if ( x == -1 )
        print ERRNO
    else
        print $0;
}

$ awk -f errno.awk items.txt
101,HD Camcorder,Video,210,10
No such file or directory
102,Refrigerator,Appliance,850,2
No such file or directory
103,MP3 Player,Audio,270,15
No such file or directory
104,Tennis Racket,Sports,190,20
No such file or directory
105,Laser Printer,Office,475,5
No such file or directory