Awk#

Linux 的 awk 套件主要由 GNU 專案維護,屬於 GNU gawk 工具集的一部分。

awk 是一個「以欄位為核心的文字處理語言」,主要用途是從結構化文字中,依條件擷取、判斷、計算、重組資料。

Install#

$ sudo apt install gawk

Operate#

語法#

awk options 'pattern {action}' file
參數說明
optionsawk 的選項參數
pattern用來匹配輸入資料的模式
action當模式匹配成功時要執行的動作
file要處理的輸入檔案

options 参數说明:#

參數說明
-F指定輸入欄位的分隔符號
-v在執行 awk 腳本前設定變數的值
-f從指定的檔案中讀取 awk 腳本
-V –version顯示 awk 的版本資訊
-h –help顯示幫助資訊

示範#

印出整行(這裡 $0 是預設整行。)#

awk '{print $0}' filename.txt

印出包含 “error” 的行#

awk '/error/ {print}' /var/log/syslog

使用逗號作為分隔符,印出每行的第一欄#

awk -F, '{print $1}' data.csv

印出每行的第一欄和第三欄#

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

在每行前印出變數 var 的值#

awk -v var="value" '{print var, $0}' file.txt

程式區塊與控制流程#

區塊說明
BEGIN {}程式開始前執行
主體 {}對每行處理
END {}處理完後執行
awk 'BEGIN {print "Start"} {print NR, $0} END {print "End"}' file.txt

此外也支援如 if/else, for/while, 邏輯運算符等控制結構。

寫成腳本檔執行#

當指令變複雜,可以寫成 .awk 腳本:

#!/usr/bin/awk -f
# list.awk
BEGIN { print "Name Telephone Wage Hours" }
{ print $1, $2, $3, $4 }

執行:

awk -f list.awk employee.txt

常用內建變數與條件#

常見變數:NR(目前行號)、NF(目前欄位數)、FS(輸入分隔符)、OFS(輸出分隔符)。

例:只印欄位數 ≥ 3 的行的最後一欄:

awk 'NF >= 3 { print $NF }' file.txt

Reference#

Official docs:

awk