鍍金池/ 教程/ Linux/ 內(nèi)置變量
循環(huán)  
操作符  
優(yōu)雅地輸出
用戶自定義函數(shù)
正則表達(dá)式
基本示例
內(nèi)置函數(shù)
工作流程
概述
控制流  
數(shù)組  
輸出重定向
基本語(yǔ)法
運(yùn)行環(huán)境
內(nèi)置變量

內(nèi)置變量

AWK 提供了一些內(nèi)置變量。 它們?cè)谀銓?AWK 腳本的時(shí)候起著很重要的作用。 這一章節(jié)中將會(huì)展示如何使用這些內(nèi)置變量。

標(biāo)準(zhǔn) AWK 變量

下面將介紹標(biāo)準(zhǔn) AWK 變量:

ARGC

ARGC 表示在命令行提供的參數(shù)的個(gè)數(shù)。

[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four

執(zhí)行上面的命令可以得到如下的結(jié)果:

Arguments = 5

程序哪兒出毛病了嗎?為什么只輸入四個(gè)參數(shù)而 AWK 卻顯示輸入的參數(shù)個(gè)數(shù)的五呢? 看完下面這個(gè)例子,你就會(huì)明白的。

ARGV

這個(gè)變量表示存儲(chǔ)命令行輸入?yún)?shù)的數(shù)組。數(shù)組的有效索引是從 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

執(zhí)行上面的命令可以得到如下的結(jié)果:

ARGV[0] = awk
ARGV[1] = one
ARGV[2] = two
ARGV[3] = three

CONVFMT

此變量表示數(shù)據(jù)轉(zhuǎn)換為字符串的格式,其默認(rèn)值為 %.6g。

[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Conversion Format = %.6g 

ENVIRON

此變量是與環(huán)境變量相關(guān)的關(guān)聯(lián)數(shù)組變量。

[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

jerry

可以使用 GNU/Linux 系統(tǒng)中的 env 命令查詢其它環(huán)境變量的名字。

FILENAME

此變量表示當(dāng)前文件名稱。

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

marks.txt

值得注意的是在開始?jí)K中FILENAME是未定義的。

FS

此變量表示輸入的數(shù)據(jù)域之間的分隔符,其默認(rèn)值是空格。 你可以使用 -F 命令行選項(xiàng)改變它的默認(rèn)值。

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

FS =  $

NF

此變量表示當(dāng)前輸入記錄中域的數(shù)量。例如,下面這個(gè)例子只輸出超過兩個(gè)域的行:

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'

執(zhí)行上面的命令可以得到如下的結(jié)果:

One Two Three
One Two Three Four

NR

此變量表示當(dāng)前記錄的數(shù)量。(譯注:該變量類似一個(gè)計(jì)數(shù)器,統(tǒng)計(jì)記錄的數(shù)量)。下面例子會(huì)輸出讀入的前三行(NR<3)。

[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'

執(zhí)行上面的命令可以得到如下的結(jié)果:

One Two
One Two Three

FNR

該變量與 NR 類似,不過它是相對(duì)于當(dāng)前文件而言的。此變量在處理多個(gè)文件輸入時(shí)有重要的作用。每當(dāng)從新的文件中讀入時(shí) FNR 都會(huì)被重新設(shè)置為 0。

OFMT

此變量表示數(shù)值輸出的格式,它的默認(rèn)值為 %.6g。

[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'

執(zhí)行上面的命令可以得到如下的結(jié)果:

OFMT = %.6g

OFS

此變量表示輸出域之間的分割符,其默認(rèn)為空格。

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

OFS =  $

ORS

此變量表示輸出記錄(行)之間的分割符,其默認(rèn)值是換行符。

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

ORS = $
$

RLENGTH

此變量表示 match 函數(shù)匹配的字符串長(zhǎng)度。AWK 的 match 函數(shù)用于在輸入的字符串中搜索指定字符串。

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

2

RS

此變量表示輸入記錄的分割符,其默認(rèn)值為換行符。

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

RS = $
$

RSTART

此變量表示由 match 函數(shù)匹配的字符串的第一個(gè)字符的位置。

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

9

SUBSEP

此變量表示數(shù)組下標(biāo)的分割行符,其默認(rèn)值為 \034

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

SUBSEP = ^\$

$0

此變量表示整個(gè)輸入記錄。

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

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

$n

此變量表示當(dāng)前輸入記錄的第 n 個(gè)域,這些域之間由 FS 分割。

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

執(zhí)行上面的命令可以得到如下的結(jié)果:

Physics    80
Maths      90
Biology    87
English    85
History    89

GNU AWK 特定的變量

下面將介紹 GNU AWK 專有的變量:

ARGIND

此變量表示當(dāng)前文件中正在處理的 ARGV 數(shù)組的索引值。

[jerry]$ awk '{ print "ARGIND   = ", ARGIND; print "Filename = ", ARGV[ARGIND] }' junk1 junk2 junk3

執(zhí)行上面的命令可以得到如下的結(jié)果:

ARGIND   =  1
Filename =  junk1
ARGIND   =  2
Filename =  junk2
ARGIND   =  3
Filename =  junk3

BINMODE

此變量用于在非 POSIX 系統(tǒng)上指定 AWK 對(duì)所有文件的 I/O 都使用二進(jìn)制模式。 數(shù)值1,2 或者 3 分別指定輸入文件、輸出文件或所有文件。 字符串值 r 或 w 分別指定輸入文件或者輸出文件使用二進(jìn)制 I/O模式。 字符串值 rw 或 wr 指定所有文件使用二進(jìn)制 I/O模式。

ERRNO

此變量用于存儲(chǔ)當(dāng) getline 重定向失敗或者 close 函數(shù)調(diào)用失敗時(shí)的失敗信息。

[jerry]$ awk 'BEGIN { ret = getline < "junk.txt"; if (ret == -1) print "Error:", ERRNO }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

Error: No such file or directory

FIELDWIDTHS

該變量表示一個(gè)分割域之間的空格的寬度。當(dāng)此變量被設(shè)置后, GAWK 將輸入的域之間的寬度處理為固定寬度,而不是使用 FS 的值作為域間的分割符。

IGNORECASE

當(dāng)此變量被設(shè)置后,GAWK將變得大小寫不敏感。下面是一個(gè)簡(jiǎn)單的例子:

[jerry]$ awk 'BEGIN{IGNORECASE=1} /amit/' marks.txt

執(zhí)行上面的命令得到如下的結(jié)果:

1)    Amit     Physics    80

LINT

此變量提供了在 GAWK 程序中動(dòng)態(tài)控制 --lint 選項(xiàng)的一種途徑。當(dāng)這個(gè)變量被設(shè)置后, GAWK 會(huì)輸出 lint 警告信息。如果給此變量賦予字符值 fatal,lint 的所有警告信息將會(huì)變了致命錯(cuò)誤信息(fatal errors)輸出,這和 --lint=fatal 效果一樣。

[jerry]$ awk 'BEGIN {LINT=1; a}'

執(zhí)行上面的命令可以得到如下的結(jié)果:

awk: cmd. line:1: warning: reference to uninitialized variable `a'
awk: cmd. line:1: warning: statement has no effect

PROCINFO

這是一個(gè)關(guān)聯(lián)數(shù)組變量,它保存了進(jìn)程相關(guān)的信息。比如, 真正的和有效的 UID 值,進(jìn)程 ID 值等等。

[jerry]$ awk 'BEGIN { print PROCINFO["pid"] }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

4316

TEXTDOMAIN

此變量表示 AWK 程序當(dāng)前文本域。 它主要用尋找程序中的字符串的本地翻譯,用于程序的國(guó)際化。

[jerry]$ awk 'BEGIN { print TEXTDOMAIN }'

執(zhí)行上面的命令可以得到如下的結(jié)果:

messages

(譯注:輸出 message 是由于 TEXTDOMAIN 的默認(rèn)值為 messages) 上面所有的輸出都是英文字符是因?yàn)楸镜卣Z(yǔ)言環(huán)境配置為 en_IN 。

上一篇:基本語(yǔ)法下一篇:輸出重定向