awk

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 的處理流程是:

  1. 讀入第一行,並將第一行的資料填入 $0, $1, $2.... 等變數當中;

  2. 依據 "條件類型的限制,判斷是否需要進行後面的 "動作"

  3. 做完所有的動作與條件類型;

  4. 若還有後續的『行』的數據,則重複上面 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}'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章