Linux awk 命令詳解

唐青枫發表於2024-11-20

簡介

awkLinux 中強大的文字處理工具,廣泛用於模式匹配掃描,資料提取,文字操作。

使用場景:

  • 解析日誌檔案
  • 彙總資料
  • 格式化文字輸出
  • 從檔案中提取指定的資訊

歷史

awk 由三個人共同創造的,以三個人的 last name 的首字母組成

  • Alfred V. Aho
  • Peter J. Weinberger
  • Brian W. Kernighan

基本語法

awk 'pattern { action }' file

# pattern 是匹配的模式,如正規表示式
# action 是匹配後進行的操作,如:列印,修改等
# file 要操作的檔案,如果不指定檔案,則從標準輸入中讀取

核心概念

記錄和欄位

  • 記錄:檔案中的每一行作為一個記錄
  • 欄位:欄位是記錄的一部分,透過指定的分隔符分割,預設的分隔符是空格,可以透過 -F 選項自定義分隔符

其中,$1$2$<n> 等代表第幾個欄位

$NF 代表最後一個欄位,$0 代表所有記錄,即全部內容

abc def,其中 abc 是一個欄位,def 是一個欄位

模式

可以是正規表示式、數字比較、條件判斷等

要執行的操作

定義在花括號 {} 裡面

常用示例

列印所有行資料

awk '{ print $0 }' file

列印指定的欄位

awk '{ print $1, $3 }' file

# 列印每行的第一個和第三個欄位

列印模式匹配的行

awk '/error/ { print $0 }' file

# 列印包含 error 文字的行

使用條件表示式

awk '$3 > 50 { print $1, $2 }' file

# 當第三個欄位大於50時列印第一個和第二個欄位

使用範圍比較表示式

awk 'NR >= 5 && NR <= 10 { print $0 }' file

# NR表示行號
# 以上表示列印第五到第十行的內容

自定義欄位分隔符

awk -F ',' '{ print $1, $2 }' file

# 此處指定分隔符為逗號

內建變數

  • $0:所有記錄/全部內容
  • $1$1,...:第幾個欄位
  • NF:當前行的欄位數
  • NR:行號
  • FS:欄位分隔符
  • OFS:輸出的欄位分隔符
  • RS:記錄分隔符/行分隔符,預設 \n
  • ORS:輸出的記錄分隔符/行分隔符

高階用法示例

列印行號

awk '{ print NR, $0 }' file

統計欄位

awk '{ sum += $3 } END { print "Total:", sum }' file

# 統計每行第三個欄位之和

替換欄位

awk '{$2 = "REPLACED"; print $0 }' file

# 替換每行的第二個欄位值為 REPLACED

列印模式匹配到的行數

awk '/pattern/ { count++ } END { print count }' file

格式化輸出

awk '{ printf "Line %d: %s\n", NR, $0 }' file

透過管道處理標準輸入

cat file | awk '{ print $1, $2 }'

awk 命令寫到指令碼里複用

新建 script.awk 檔案,寫入以下內容:

{ print $1, $NF }

使用 -f 執行指令碼檔案

awk -f script.awk file

相關文章