AWK內置變量
AWK提供了幾個內置變量。他們發揮着重要的作用,同時編寫AWK腳本。本章說明了內置變量的使用。
標準AWK變量
以下是標準AWK變量:
ARGC
這意味着在命令行提供參數的個數。
[jerry]$ awk 'BEGIN {print "Arguments =", ARGC}' One Two Three Four
在執行上面的代碼後,得到以下結果:
Arguments = 5
這程序有什麼問題?爲什麼AWK是顯示5時,只傳過4個參數。只要看看下面的例子就清楚了。
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
要找到其他的環境變量名稱,使用GNU/Linux的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
它代表了當前記錄,其中字段由FS分隔的第n個字段。
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
在執行上面的代碼後,得到以下結果:
Physics 80
Maths 90
Biology 87
English 85
History 89
GNU AWK specific variables
以下是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
它是用來指定二進制模式對所有文件I/O在非POSIX系統。 1,2,或3個數值,指定輸入文件,輸出文件或所有文件,分別應該使用二進制的I/O。字符串值r或w指定輸入文件或輸出文件,分別應該使用二進制的I/O。對rw orwr字符串值指定所有文件應使用二進制I/O。
ERRNO
一個字符串,指示錯誤時重定向失敗函數getline或者接近調用失敗。
[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警告。當指定的字符串值是致命的,lint警告成爲致命錯誤,類似--lint=致命的。
[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是語言環境的英文文本。