awk 是「模式掃描與處理語言」,以「模式 {動作}」為核心架構,逐行讀取輸入、切割欄位、匹配模式、執行動作。本文系統整理基礎語法、內建變數、流程控制、陣列操作、BEGIN/END 區塊與三大實戰統計範例。
awk 'pattern {action}' file
# 或
awk -f script.awk file
$1、$2... $0 為整行print $0| 類型 | 範例 | 說明 |
|---|---|---|
| 關係運算式 | $1 > 4, $2 == $3 | 數值/字串比較 |
| 正則匹配 | /pattern/, $2 ~ /John/ | ~ 匹配,!~ 不匹配 |
| 範圍模式 | /start/,/end/ | 從匹配 start 到匹配 end 的所有行 |
| BEGIN | BEGIN { ... } | 處理第一行前執行(初始化) |
| END | END { ... } | 處理完所有行後執行(彙總輸出) |
NF:當前行欄位數NR:已讀取記錄數(行號)FILENAME:當前處理檔名FS:輸入欄位分隔符(預設空白,可用 -F 修改)OFS:輸出欄位分隔符(預設空格)RS:輸入記錄分隔符(預設換行)ORS:輸出記錄分隔符(預設換行)print, printf, getlineif/else, while, do/while, for, break, continue, exitlength, substr, index, match, gsub, tolower, touppersqrt, log, exp, int, rand, srandarr["key"] = valuefor (k in arr) print k, arr[k]delete arr["key"] 或 delete arr(清空)test.txt:Tom 85 90 78 John 92 88 95 Tom 70 80 85 Mary 88 92 90 John 85 89 91
# 所有 John 的記錄
awk '/John/' test.txt
awk '$2=="John" {print $0}' test.txt
# 第三欄 >= 120(此資料無,示範語法)
awk '$3 >= 120' test.txt
# CSV 格式指定分隔符
awk -F',' '/John/' test.csv
# John 所有科目總分
awk '$2=="John" {sum+=$3+$4+$5} END {print "John total:", sum}' test.txt
# 初始分數 60 再累加
awk 'BEGIN {sum=60} $2=="John" {sum+=$3+$4+$5} END {print sum}' test.txt
awk '{
name=$1
scores[name]+=$2+$3+$4
}
END {
for (n in scores) print n, scores[n]
}' test.txt
輸出:
Tom 488
John 700
Mary 270
grep/sed/cut 將亂糟糟的日志轉為固定欄位格式。sort/uniq/column -t 美化。awk 是「單行腳本裡的資料庫引擎」。掌握 模式 {動作} 核心、善用 BEGIN/END 邊界控制、靈活運用關聯陣列分組統計,即能在命令列秒級完成「其他語言需寫幾十行」的文字資料分析任務。參考教學:jiayii.com/awk-tutorial。