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 ";" 等指定正確的欄位分隔符。