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是語言環境的英文文字。