博客 / 詳情

返回

Linux awk 命令詳解

簡介

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
user avatar emtalk_qf 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.