awk — 文字資料處理與報表工具

以欄位為基礎,對結構化文字進行資料提取、計算與格式化。

語法

awk [選項] '程式' [檔案...]

常用選項

選項 說明 範例
-F 分隔符 指定欄位分隔符(預設為空白/Tab) awk -F: '{print $1}' /etc/passwd
-v 變數=值 在執行前設定 awk 變數 awk -v limit=100 '$3>limit' file
-f 腳本檔 從檔案讀取 awk 程式 awk -f process.awk data.txt
-OFS=分隔符 設定輸出欄位分隔符(在程式中設定) awk 'BEGIN{OFS=","}'

使用範例

範例 1:印出指定欄位

$1、$2 代表第 1、2 欄,$NF 代表最後一欄,$0 代表整行。

$ awk '{print $1, $3}' /etc/passwd
預設以空白或 Tab 分隔欄位。
範例 2:自訂分隔符(解析 /etc/passwd)

使用 -F: 指定冒號為分隔符,列出所有使用者名稱(第1欄)與家目錄(第6欄)。

$ awk -F: '{print $1, $6}' /etc/passwd
root /root
daemon /usr/sbin
user /home/user
範例 3:條件過濾行

只印出第 3 欄大於 1000 的行(UID > 1000 的一般使用者)。

$ awk -F: '$3 > 1000 {print $1, $3}' /etc/passwd
user 1000
alice 1001
範例 4:計算欄位總和

對第 2 欄進行累加,最後在 END 區塊輸出總計。

$ awk '{sum += $2} END {print "Total:", sum}' sales.txt
Total: 45230
範例 5:格式化輸出(printf)

使用 printf 格式化輸出,類似 C 語言的 printf。

$ df -h | awk 'NR>1 {printf "%-20s %5s %5s\n", $1, $2, $5}'
/dev/sda1              50G   45%
tmpfs                  2.0G    1%
範例 6:內建變數 NR、NF

NR = 當前行號,NF = 欄位數,常用於篩選特定行或欄位。

$ awk 'NR>=2 && NR<=5 {print NR": "$0}' data.txt
2: second line
3: third line
4: fourth line
5: fifth line
範例 7:BEGIN 與 END 區塊

BEGIN 在讀取任何行前執行(設定標頭),END 在全部讀完後執行(輸出統計)。

$ awk 'BEGIN{print "Name\tScore"} {print} END{print "---\nDone"}' scores.txt
Name	Score
Alice	95
Bob	87
---
Done

常見錯誤與排錯

awk: line 1: syntax error at or near ...
原因
awk 程式語法錯誤,常見於引號或括號不配對。
解法
確認使用單引號包住整個 awk 程式,程式格式為:'{動作}'。
輸出結果不符合預期(欄位對不上)
原因
預設分隔符為連續空白,如果資料用其他字元分隔(如逗號)則需要 -F。
解法
使用 -F, 或 -F ";" 等指定正確的欄位分隔符。

延伸閱讀