在運維日常工作,"awk"的日常使用規範有哪些?

黄嘉波發表於2024-09-12

awk 是一個強大的文字處理工具,最初用於 Unix 系統,現在也可以在類 Unix 系統(如 Linux 和 macOS)上使用。它允許你執行復雜的文字處理任務而不需要編寫完整的程式。下面是一些基本概念以及 awk 的使用規則:

基本語法

awk 命令的基本形式是:

awk 'pattern {action}' [file ...]
  • pattern 定義了一個模式,用來匹配輸入行。
  • {action} 是當模式匹配成功時執行的一系列命令。
  • [file ...] 是需要處理的一個或多個檔名。如果沒有指定檔案,則 awk 從標準輸入讀取資料。

常用選項

  • -F fs 設定欄位分隔符為 fs
  • -v var=valawk 程式中定義變數 var 並賦值為 val
  • -f script-file 指定一個指令碼檔案來代替直接在命令列上寫 awk 程式。

內建變數

awk 提供了許多內建變數,用於簡化文字處理任務:

  • ARGV 包含命令列引數。
  • ARGC 包含命令列引數的數量。
  • ARGIND 當前正在處理的檔案在 ARGV 中的位置。
  • FILENAME 當前輸入檔案的名字。
  • NR 記錄號,即處理了多少行。
  • NF 欄位數,即當前行有多少個欄位。
  • RS 記錄分隔符,預設為換行符。
  • FS 欄位分隔符,預設為空白字元(空格或製表符)。
  • OFS 輸出欄位分隔符,預設為空格。
  • ORS 輸出記錄分隔符,預設為換行符。

示例

  1. 列印第二列:
    awk '{print $2}' file
    
  2. 設定欄位分隔符為逗號,並列印第一列:
    awk -F, '{print $1}' file
    
  3. 統計檔案中的行數:
    awk 'END{print NR}' file
    
  4. 統計每行的單詞數:
    awk '{print NF}' file
    
  5. 統計所有數字的總和(假設所有行都是數字):
    awk '{sum += $1} END{print sum}' file
    

複雜操作

awk 還支援條件語句、迴圈、函式定義等,可以實現非常複雜的邏輯。例如:

awk '
    BEGIN { sum = 0 }
    {
        if ($1 ~ /^[0-9]+$/) # 如果第一列是數字
            sum += $1
    }
    END {
        print "Total:", sum
    }' file

以上只是一個簡要介紹,awk 的功能遠不止這些。為了更深入地學習 awk,建議查閱官方文件或者相關書籍。

相關文章