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

要查詢其他環境變數的名稱,請使用 env 命令。

FILENAME

它表示當前檔名。

示例

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

執行此程式碼後,您將獲得以下結果:

輸出

marks.txt

請注意,在 BEGIN 程式碼塊中 FILENAME 未定義。

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

它表示當前記錄的編號。例如,以下示例在當前記錄號小於 3 時列印記錄。

示例

[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 的 match 函式在輸入字串中搜索給定的字串。

示例

[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

它表示當前記錄中的第 n 個欄位,其中欄位由 FS 分隔。

示例

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

執行此程式碼後,您將獲得以下結果:

輸出

Physics   80
Maths     90
Biology   87
English   85
History   89

GNU AWK 特定變數

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

它用於在非 POSIX 系統上為所有檔案 I/O 指定二進位制模式。1、2 或 3 的數值分別指定輸入檔案、輸出檔案或所有檔案應使用二進位制 I/O。字串值 rw 分別指定輸入檔案或輸出檔案應使用二進位制 I/O。字串值 rwwr 指定所有檔案應使用二進位制 I/O。

ERRNO

當重定向 getline 失敗或 close 呼叫失敗時,一個字串指示錯誤。

示例

[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 警告。當分配字串值 fatal 時,lint 警告會變成致命錯誤,與 --lint=fatal 完全相同。

示例

[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 區域設定,以上輸出顯示英文文字

廣告

© . All rights reserved.