- AWK 教程
- AWK - 首頁
- AWK - 概述
- AWK - 環境
- AWK - 工作流程
- AWK - 基本語法
- AWK - 基本示例
- AWK - 內建變數
- AWK - 運算子
- AWK - 正則表示式
- AWK - 陣列
- AWK - 控制流
- AWK - 迴圈
- AWK - 內建函式
- AWK - 使用者自定義函式
- AWK - 輸出重定向
- AWK - 美化輸出
- AWK 有用資源
- AWK - 快速指南
- AWK - 有用資源
- AWK - 討論
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。字串值 r 或 w 分別指定輸入檔案或輸出檔案應使用二進位制 I/O。字串值 rw 或 wr 指定所有檔案應使用二進位制 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 區域設定,以上輸出顯示英文文字