首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Awk 入門與進階實戰:文本處理利器完全指南

     編輯:PHP 綜合知識

Awk 語言核心概念與實戰技巧

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

Awk vs Sed vs Grep 選擇指南

  • Grep: 純文本搜尋、過濾行
  • Sed: 行編輯、替換、刪除、插入
  • Awk: 結構化資料處理、欄位運算、報表生成、複雜邏輯

現代替代工具

複雜資料處理可考慮:Miller (mlr)、csvkit、Python pandas、jq (JSON) —— 但 Awk 仍是零依賴、啟動極快的最佳選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved