BEGIN 區塊(初始化)。$0 整行,$1 第一欄,$n 第 n 欄。action。END 區塊(收尾)。awk [-F 欄位分隔符] '{pattern + action}' {filenames}
pattern:比對條件(可為正則、關係式、範圍)。action:大括號內的動作指令,多語句以分號分隔。-F 可指定分隔符(如 -F':'、-F'\t')。| 變數 | 說明 |
|---|---|
ARGC | 命令列參數個數 |
ARGV | 命令列參數陣列 |
ENVIRON | 環境變數關聯陣列 |
FILENAME | 目前處理的檔案名 |
FNR | 目前檔案的記錄數(跨檔案重置) |
FS | 輸入欄位分隔符(等同 -F) |
NF | 目前記錄的欄位數 |
NR | 已讀總記錄數(跨檔案累計) |
OFS | 輸出欄位分隔符 |
ORS | 輸出記錄分隔符 |
RS | 輸入記錄分隔符 |
gsub(r,s) / gsub(r,s,t):全域替換。index(s,t):回傳子字串首次出現位置。length(s):字串長度。match(s,r):測試正則比對。split(s,arr,fs):分割字串存入陣列。sprintf(fmt,expr):格式化字串。sub(r,s):首次替換。substr(s,p) / substr(s,p,n):擷取子字串。awk 'BEGIN { ... 初始化 ... } { ... 每行處理 ... } END { ... 收尾 ... }' file
if (expr) { stmt; } else if (expr2) { stmt2; } else { stmt3; }
awk 陣列底層為雜湊表,遍歷順序非預期順序。常用於統計、去重、聚合。
awk -F ':' 'BEGIN {count=0} {name[count]=$1; count++} END {for(i=0;i
awk -F'\t' '{a[$1]++} END {for(j in a) print a[j], j}' filename | sort -rn | more
輸入:
apple
banana
apple
apple
banana
pear
輸出:
3 apple
2 banana
1 pear
進階提示:搭配 sort、uniq、cut 等工具可構建強大的文字處理管線。