awk 擁有豐富運算符體系,語法風格與 C 語言高度一致。本文分類整理並附實測範例,助你精準掌握優先級與型別轉換規則。
| 類別 | 運算符 | 說明 |
|---|---|---|
| 賦值 | = += -= *= /= %= ^= **= | 複合賦值,a+=5 等同 a=a+5 |
| 邏輯 | || && | 短路求值,0 1 對應 false true |
| 正則 | ~ !~ | 匹配/不匹配正則,~ 優先級低於關係運算符 |
| 關係 | < <= > >= != == | 數字比較數字,字串比較字串(ASCII序),混合型別自動轉字串 |
| 算術 | + - * / % | 加減乘除取模,操作數自動轉數字(非數字變 0) |
^ ** | 冪運算,2^3=8 | |
++ -- | 前綴/後綴遞增減,++a 先增後用 | |
| 其他 | $ | 欄位引用 $1 $NF |
空格 | 字串連接 a b 等同 a""b | |
?: | 三元條件 cond?val1:val2 | |
in | 陣列鍵值存在性 "key" in arr |
awk 'BEGIN{a="b"; print a++, ++a}' # 輸出: 0 2 (字串轉 0 再運算)
awk 'BEGIN{a="100"; b="10test"; print a+b+0}' # 輸出: 110 (遇非數字停止)
awk 'BEGIN{a="11"; if(a >= 9) print "ok"}' # 字串比較: "11" < "9" → false
awk 'BEGIN{a=11; if(a >= 9) print "ok"}' # 數字比較: 11 >= 9 → true
規則:雙操作數皆為數字 → 數字比較,否則 → 字串比較(ASCII 碼序)。
awk 'BEGIN{a=1;b=2; print (a>5 && b<=2), (a>5 || b<=2)}'
# 輸出: 0 1 (&& 短路,|| 第二運算元求值)
awk 'BEGIN{a="100testa"; if(a ~ /^100*/) print "ok"}' # ^100* 匹配 100 開頭
awk 'BEGIN{a="b"; print (a=="b"?"ok":"err")}' # 輸出: ok
awk 'BEGIN{arr[0]="b"; arr["b"]="c"; print ("b" in arr)}' # 1 (鍵 "b" 存在)
awk 'BEGIN{arr[0]="b"; print (0 in arr)}' # 1 (鍵 0 存在)
awk 'BEGIN{arr[0]="b"; print ("c" in arr)}' # 0 (鍵 "c" 不存在)
++ -- (前綴/後綴)^ **+ - ! (一元)* / %+ - (二元)空格 (字串連接)< <= > >= != == ~ !~&&||?:= += -= ... (賦值,右結合)善用括號明確優先級,避免隱性型別轉換導致邏輯錯誤,是撰寫健壯 awk 程式的關鍵。