簡介
awk
是 Linux
中強大的文字處理工具,廣泛用於模式匹配掃描,資料提取,文字操作。
使用場景:
- 解析日誌檔案
- 彙總資料
- 格式化文字輸出
- 從檔案中提取指定的資訊
歷史
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