AWK提供了幾個(gè)內(nèi)置變量。他們發(fā)揮著重要的作用,同時(shí)編寫AWK腳本。本章說明了內(nèi)置變量的使用。
以下是標(biāo)準(zhǔn)AWK變量:
這意味著在命令行提供參數(shù)的個(gè)數(shù)。
[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four
在執(zhí)行上面的代碼后,得到以下結(jié)果:
Arguments = 5
這程序有什么問題?為什么AWK是顯示5時(shí),只傳過4個(gè)參數(shù)。只要看看下面的例子就清楚了。
它是存儲(chǔ)在命令行參數(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
它代表了數(shù)字轉(zhuǎn)換的格式和它的默認(rèn)值是 %.6g.
[jerry]$ awk 'BEGIN { print "Conversion Format =", CONVFMT }'
在執(zhí)行上面的代碼后,得到以下結(jié)果:
Conversion Format = %.6g
這是環(huán)境變量的關(guān)聯(lián)數(shù)組。
[jerry]$ awk 'BEGIN { print ENVIRON["USER"] }'
在執(zhí)行上面的代碼后,得到以下結(jié)果:
jerry
要找到其他的環(huán)境變量名稱,使用GNU/Linux的env命令。
它代表了當(dāng)前的文件名。
[jerry]$ awk 'END {print FILENAME}' marks.txt
在執(zhí)行上面的代碼后,得到以下結(jié)果:
marks.txt
請(qǐng)注意,F(xiàn)ILENAME在BEGIN塊中是未定義的。
它代表了(輸入)字段分隔符以及它的默認(rèn)值是空格。也可以通過-F命令行選項(xiàng)進(jìn)行更改。
[jerry]$ awk 'BEGIN {print "FS = " FS}' | cat -vte
在執(zhí)行上面的代碼后,得到以下結(jié)果:
FS = $
它代表在當(dāng)前記錄的字段的數(shù)量。例如其中包含兩個(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
它表示當(dāng)前記錄的編號(hào)。比如下面的例子打印記錄,如果當(dāng)前記錄包含少于三個(gè)字段
[jerry]$ echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'
在執(zhí)行上面的代碼后,得到以下結(jié)果:
One Two One Two Three
它類似于NR,但相對(duì)于當(dāng)前文件。這是當(dāng)AWK工作在多個(gè)文件非常有用。 FNR的值將重置使用新的文件。
它代表的輸出格式數(shù)量和它的默認(rèn)值是 %.6g.
[jerry]$ awk 'BEGIN {print "OFMT = " OFMT}'
在執(zhí)行上面的代碼后,得到以下結(jié)果:
OFMT = %.6g
它代表輸出字段分隔符以及它的默認(rèn)值是空格。
[jerry]$ awk 'BEGIN {print "OFS = " OFS}' | cat -vte
在執(zhí)行上面的代碼后,得到以下結(jié)果:
OFS = $
它代表輸出記錄分隔符以及它的默認(rèn)值是換行。
[jerry]$ awk 'BEGIN {print "ORS = " ORS}' | cat -vte
在執(zhí)行上面的代碼后,得到以下結(jié)果:
ORS = $ $
它表示匹配match函數(shù)字符串的長度。 AWK的匹配功能搜索輸入字符串。
[jerry]$ awk 'BEGIN { if (match("One Two Three", "re")) { print RLENGTH } }'
在執(zhí)行上面的代碼后,得到以下結(jié)果:
2
它表示(輸入)記錄分隔符以及它的默認(rèn)值是換行。
[jerry]$ awk 'BEGIN {print "RS = " RS}' | cat -vte
在執(zhí)行上面的代碼后,得到以下結(jié)果:
RS = $ $
它表示匹配match函數(shù)字符串中的第一個(gè)位置。
[jerry]$ awk 'BEGIN { if (match("One Two Three", "Thre")) { print RSTART } }'
在執(zhí)行上面的代碼后,得到以下結(jié)果:
9
它代表了數(shù)組下標(biāo)分隔符,它的默認(rèn)值是 \034.
[jerry]$ awk 'BEGIN { print "SUBSEP = " SUBSEP }' | cat -vte
在執(zhí)行上面的代碼后,得到以下結(jié)果:
SUBSEP = ^\$
它代表了整個(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
它代表了當(dāng)前記錄,其中字段由FS分隔的第n個(gè)字段。
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
在執(zhí)行上面的代碼后,得到以下結(jié)果:
Physics 80 Maths 90 Biology 87 English 85 History 89
以下是GNU AWK特定變量:
它表示索引在當(dāng)前文件的ARGV將在處理。
[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
它是用來指定二進(jìn)制模式對(duì)所有文件I/O在非POSIX系統(tǒng)。 1,2,或3個(gè)數(shù)值,指定輸入文件,輸出文件或所有文件,分別應(yīng)該使用二進(jìn)制的I/O。字符串值r或w指定輸入文件或輸出文件,分別應(yīng)該使用二進(jìn)制的I/O。對(duì)rw orwr字符串值指定所有文件應(yīng)使用二進(jìn)制I/O。
一個(gè)字符串,指示錯(cuò)誤時(shí)重定向失敗函數(shù)getline或者接近調(diào)用失敗。
[jerry]$ awk 'BEGIN { ret = getline < "junk.txt"; if (ret == -1) print "Error:", ERRNO }'
在執(zhí)行上面的代碼后,得到以下結(jié)果:
Error: No such file or directory
用空格分隔字段寬度列表。當(dāng)此變量設(shè)置,GAWK解析而不是使用FS變量作為字段分隔符的值輸入到固定寬度的字段。
當(dāng)此變量設(shè)置GAWK變成不區(qū)分大小寫。下面簡單的例子說明了這一點(diǎn):
[jerry]$ awk 'BEGIN{IGNORECASE=1} /amit/' marks.txt
在執(zhí)行上面的代碼后,得到以下結(jié)果:
上一篇:AWK工作流程下一篇:AWK正則表達(dá)式