awk 將文字轉換為記錄串流。每筆記錄都會依序接受模式—動作規則的測試,因此該語言適合產生報表、驗證與小型資料轉換。POSIX awk 廣泛可用;GNU awk(gawk)則提供額外功能,腳本需要這些功能時應明確宣告。
記錄、欄位與計數器 #
RS 分隔輸入記錄,預設值為換行。FS 分隔欄位;其預設值會特殊處理連續的空格與定位字元。$0 是整筆記錄,$1 到 $NF 是欄位,而 NF 是欄位數。NR 計算所有輸入中的記錄,FNR 則在每個輸入檔案重新開始。
awk -F ':' '$3 >= 1000 { print $1, $6 }' /etc/passwd
awk -v limit=10 'NF > limit { print FILENAME ":" FNR }' input產生結構化結果時,請明確設定輸出分隔字元:
BEGIN { FS = OFS = "," }
NF >= 3 { total += $3 }
END { print "total", total }GNU awk 將多字元 RS 視為正規表示式。可攜式 awk 要求單一字元的記錄分隔字元,因此處理以 NUL 分隔的名稱時,應明確要求 gawk,例如 gawk -v RS='\0'。
撰寫模式—動作程式 #
規則形式為 pattern { action }。例如 /error/ 這類正規表示式會測試 $0;運算式會依 awk 的真值規則測試;省略模式則符合每筆記錄。BEGIN 在輸入前執行,END 在最後一筆記錄後執行。
BEGIN { FS = ":" }
$7 ~ /nologin$/ { next }
{ users[$1] = $6 }
END {
for (name in users)
print name, users[name]
}關聯陣列的索引鍵是字串,而 for (key in array) 沒有可攜式的迭代順序。需要確定性輸出時,請在外部排序,或使用有文件說明的 GNU awk 排序功能。
值與正規表示式 #
awk 值具有字串與數值形式。情境會選擇轉換方式:total += $3 需要數字,而串接需要字串。依賴轉換前請先驗證輸入,因為非數值字串在數值情境會轉換為零。
正規表示式使用 POSIX 擴充正規表示式語法。~ 與 !~ 會測試值;match()、sub()、gsub() 與 split() 在動作內運作。sub() 變更第一個符合項目,gsub() 變更所有符合項目。
awk '
/^[[:space:]]*#/ || NF == 0 { next }
$2 ~ /^[0-9]+$/ { count[$1] += $2 }
END { for (key in count) print key, count[key] }
' metrics.txt安全地呼叫 awk
#
請將程式以單引號包住,讓 shell 不會在 awk 接收前展開 $1、反斜線或萬用字元。使用 -v 傳遞 shell 資料,而不要將其插入程式原始碼:
awk -v prefix="$prefix" '$1 == prefix { print $0 }' input
awk -f report.awk -- --filename-starting-with-dash-- 選項會在支援它的實作中結束 awk 選項處理;輸入名稱可能以 - 開頭時請使用它。將 -v 資料視為資料,而非 awk 原始碼。對不受信任的 CSV,請使用能識別 CSV 的剖析器或 GNU awk 有文件說明的 --csv 模式,因為 FS="," 並未實作 CSV 引號規則。
評論
在 GitHub 上閱讀或評論(發表評論需要登入)