Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> 關於 Linux

Linux 文本處理三劍客之 awk 進階實戰指南

編輯:關於 Linux

awk 不僅是文本處理工具,更是一門圖靈完備的腳本語言。作為「文本處理三劍客」中功能最強大的一環,awk 擅長列式數據提取、格式化報表生成、複雜邏輯運算。本文系統梳理調用方式、內置變量、輸出函數、外部變量傳遞四大核心知識體系,配合實戰場景案例,助您從入門進階至專家級應用。

awk 工作流程示意圖

三種調用模式

1. 命令行直執行 (最常用)

awk [-F '分隔符'] '程序碼' 文件1 文件2 ...
# 示例:以冒號分隔 /etc/passwd,打印用戶名與 Shell
awk -F: '{print $1, $NF}' /etc/passwd

要點:單引號包裹程序碼防止 Shell 變量展開;-F 支援正則表達式 (如 -F'[:,]')。

2. 可執行腳本文件 (複雜邏輯)

#!/usr/bin/awk -f
# 腳本體
BEGIN { FS=":"; OFS="\t" }
{ print $1, $3, $7 }
END { print "Total users:", NR }
chmod +x script.awk
./script.awk /etc/passwd

3. 外部腳本文件調用

awk -f script.awk input.txt

核心內置變量速查表

變量含義默認值/示例
FS輸入字段分隔符空白字符 (空格/Tab)
OFS輸出字段分隔符空格
RS輸入記錄分隔符換行符 \n
ORS輸出記錄分隔符換行符 \n
NR已讀記錄總數 (跨文件累計)行號,從 1 開始
FNR當前文件記錄數多文件時每文件歸零
NF當前記錄字段數$NF 為最後一字段
FILENAME當前處理文件名-
$0完整當前記錄整行內容
$1-$n第 n 個字段由 FS 分隔
ARGC/ARGV命令行參數個數/數組ARGV[0] 為 awk 命令本身
ENVIRON環境變量關聯數組ENVIRON["PATH"]

輸出函數雙雄

print — 簡單直觀

print $1, $3        # 逗號分隔 → 輸出用 OFS 連接
print $1 $3         # 無逗號 → 直接拼接
print "User:", $1   # 字符串常量需雙引號

printf — C 風格精準格式化

printf "%-20s %5d %s\n", $1, $2, $3
# 格式符速查:
# %s 字符串  %d 十進制整數  %f 浮點數  %x 十六進制  %o 八進制
# %c 單字符  %e 科學計數法  %g 自適應
# 修飾:- 左對齊  數字寬度  .精度  0補零

外部變量傳遞三大路徑

1. 命令行參數傳遞 (最常用)

awk -v threshold=100 '{if ($3 > threshold) print}' data.txt
# 或
awk 'BEGIN{th=100} $3>th' data.txt

2. 環境變量讀取

export MY_VAR="hello"
awk 'BEGIN{print ENVIRON["MY_VAR"]}'

3. 標準輸入管道傳遞

echo "param1 param2" | awk '{print $1, $2}'

實戰案例庫

案例 1:日誌提取錯誤碼統計 Top 10

awk '/ERROR/ {err[$5]++} END {for (e in err) print err[e], e}' app.log | sort -rn | head -10

案例 2:CSV 多列運算生成報表

awk -F, 'NR>1 {rev[$1]+=$4; qty[$1]+=$3} END {for (p in rev) printf "%s: Revenue=%.2f Qty=%d\n", p, rev[p], qty[p]}' sales.csv

案例 3:多文件合併去重 (利用 FNR/NR 差異)

awk 'NR==FNR {seen[$0]=1; next} !($0 in seen)' file1 file2
# 邏輯:先讀 file1 存入 seen,再處理 file2 只輸出未見過的行

避坑指南

  • 數值比較陷阱:字符串 "10" > "2" 為假,需強制轉數值 $1+0 > $2+0 或 ($1 > $2) + 0
  • 正則匹配 ~ 邊界:$1 ~ /^root$/ 整字段匹配,$1 ~ /root/ 子串匹配
  • 大文件內存:關聯數組過大導致 OOM,改用 sort | uniq -c 流式處理
  • FS/OFS 修改時機:BEGIN 塊修改影響全局,主塊修改僅影響後續記錄

總結

awk 的核心價值在於 模式-動作 範式與豐富內置變量的組合爆發力。掌握 FS/OFS/RS/ORS 四大分隔符控制、NR/FNR/NF 三大計數器語義、print/printf 雙輸出模式、-v/ENVIRON 變量注入,即可應對 95% 文本處理需求。進階之路建議深入學習:多維數組模擬關係運算、getline 主動讀取控制、協同 sort/join 完成類 SQL 查詢。工具無強弱,唯場景與熟練度論英雄。

Copyright © Windows教程網 All Rights Reserved