簡介
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:記錄分隔符/行分隔符,默認\nORS:輸出的記錄分隔符/行分隔符
高級用法示例
打印行號
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