Awk 是類 Unix 系統中強大的文本處理工具,擅長欄位分割、模式匹配、資料統計與報表生成。本文從基礎語法進階到實戰腳本,助你掌握這把「文本處理瑞士刀」。
awk '模式 {動作}' 輸入檔案
# 或
awk -f script.awk 輸入檔案
核心流程:逐行讀取 → 模式匹配 → 執行動作 → 輸出結果
| 變數 | 說明 |
|---|---|
| FS / -F | 輸入欄位分隔符(預設空白) |
| OFS | 輸出欄位分隔符(預設空白) |
| RS | 記錄分隔符(預設換行) |
| ORS | 輸出記錄分隔符 |
| NF | 當前記錄欄位數 |
| NR | 已處理記錄總數(行號) |
| FILENAME | 當前檔案名 |
| $0 | 完整記錄內容 |
| $1, $2... | 第 1、2... 欄位 |
# 印出第 1、3 欄位
awk '{print $1, $3}' file.txt
# 以冒號分隔,印出用戶名與家目錄
awk -F: '{print $1, $6}' /etc/passwd
# 計算第 3 欄位總和
awk '{sum += $3} END {print sum}' data.txt
# 過濾長度大於 80 的行
awk 'length($0) > 80' file.txt
# 顯示行號
awk '{print NR ": " $0}' file.txt
# 統計每個 IP 出現次數(假設第 1 欄為 IP)
awk '{ip[$1]++} END {for (i in ip) print i, ip[i]}' access.log
# log_analyzer.awk
BEGIN {
FS = " "; # 空白分隔
print "IP統計報表";
print "================";
}
{
ip[$1]++; # 統計 IP
url[$7]++; # 統計 URL (假設第 7 欄)
code[$9]++; # 統計狀態碼
size += $10; # 累加傳輸量
}
END {
print "\n前 10 大 IP:";
n = asorti(ip, sorted_ip, "@val_num_desc");
for (i = 1; i <= 10 && i <= n; i++) {
printf "%-15s %d\n", sorted_ip[i], ip[sorted_ip[i]];
}
print "\n狀態碼分布:";
for (c in code) printf "%s: %d\n", c, code[c];
print "\n總傳輸量: " size/1024/1024 " MB";
}
執行:awk -f log_analyzer.awk access.log
複雜資料處理可考慮:Miller (mlr)、csvkit、Python pandas、jq (JSON) —— 但 Awk 仍是零依賴、啟動極快的最佳選擇。