awk 也是一個非常棒的數據處理工具!相較於 sed 常常作用於一整個行的處理, awk 則比較傾向於一行當中分成數個『字段』來處理
[root@www ~]# awk '條件類型1{動作1} 條件類型2{動作2} ...' filename
[root@www ~]# last -n 5 | awk '{print $1 "\t" $3}'
$0 $1, $2...
整個 awk 的處理流程是:
讀入第一行,並將第一行的資料填入 $0, $1, $2.... 等變數當中;
依據 "條件類型" 的限制,判斷是否需要進行後面的 "動作";
做完所有的動作與條件類型;
若還有後續的『行』的數據,則重複上面 1~3 的步驟,直到所有的數據都讀完爲止。
變量名稱 | 代表意義 |
NF | 每一行 ($0) 擁有的字段總數 |
NR | 目前 awk 所處理的是『第幾行』數據 |
FS | 目前的分隔字符,默認是空格鍵 |
[root@www ~]# last -n 5| awk '{print $1 "\t lines: " NR "\t columes: " NF}'
cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}'
cat pay.txt | \
> awk 'NR==1{printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total" }
NR>=2{total = $2 + $3 + $4
printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'
上面的例子有幾個重要事項應該要先說明的:
awk 的指令間隔:所有 awk 的動作,亦即在 {} 內的動作,如果有需要多個指令輔助時,可利用分號『;』間隔,或者直接以 [Enter] 按鍵來隔開每個指令,例如上面的範例中,鳥哥共按了三次 [enter] 喔!
邏輯運算當中,如果是『等於』的情況,則務必使用兩個等號『==』!
格式化輸出時,在 printf 的格式設定當中,務必加上 \n ,才能進行分行!
與 bash shell 的變量不同,在 awk 當中,變量可以直接使用,不需加上 $ 符號。
[root@www ~]# cat pay.txt | \
> awk '{if(NR==1) printf "%10s %10s %10s %10s %10s\n",$1,$2,$3,$4,"Total"}
NR>=2{total = $2 + $3 + $4
printf "%10s %10d %10d %10d %10.2f\n", $1, $2, $3, $4, total}'