awk基礎篇——Shell 文字處理利器
阿新 • • 發佈:2018-12-09
awk
sed傾向於以行為單位進行處理,而awk更擅長將一行分為幾段進行處理。
awk的語法
awk用法
| awk '條件型別1{動作1} 條件型別2{動作2} ...'
awk '條件型別1{動作1} 條件型別2{動作2} ...' filename
awk支援兩種資料來源,既可以通過管道獲取資料,也可以從檔案獲取資料。
awk主要是處理每一行的欄位內的資料,而預設的欄位分割符為空格或tab。分割後的每一個欄位都有一個變數名來指代。第一個是$1,第二個是$2,以此類推。$0指代當前這一整行。
awk格式化輸出例項
awk格式化輸出
[[email protected] /vbird_linux]$ last -n 5
nigel pts/32 10.41.52.111 Wed Sep 12 09:24 still logged in
tris pts/26 10.41.69.55 Tue Sep 11 22:51 still logged in
tris pts/24 10.41.69.55 Tue Sep 11 22:46 still logged in
tris pts/21 10.41.69.55 Tue Sep 11 22:41 still logged in
tris pts/20 10.41.69.55 Tue Sep 11 22:41 still logged in
[[email protected]/vbird_linux]$ last -n 5 | awk '{print $1 "\t" $3}'
nigel 10.41.52.111
tris 10.41.69.55
tris 10.41.69.55
tris 10.41.69.55
tris 10.41.69.55
awk是以行為一次處理的單位,而以欄位為最小的處理單位。
awk的特殊變數
awk內建了一些特殊變數,用來儲存特殊資訊:
- NF 每一行擁有的變數總數
- NR 目前awk所處理的行數
- FS 目前的分割字元,預設是空格
awk條件輸出例項
awk條件輸出
[[email protected] /vbird_linux]$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[[email protected] /vbird_linux]$ head -n 5 /etc/passwd | awk '{FS=":"} $3<10{print $1 "\t" $3}'
root:x:0:0:root:/root:/bin/bash
bin 1
daemon 2
adm 3
lp 4
第一行沒有處理,是因為此時分割符還是預設的空格,從第二行開始才是”:”
解決方法是使用BEGIN關鍵字:
[[email protected] /vbird_linux]$ head -n 5 /etc/passwd | awk 'BEGIN {FS=":"} $3<10{print $1 "\t" $3}'
root 0
bin 1
daemon 2
adm 3
lp 4
需要特別注意,自定的風格符從第二行開始才會生效,所以通常我們需要加上BEGIN來讓其從第一行就開始生效。
awk計算功能例項
awk也可以進行一些簡單的計算
[[email protected]1507091995 ~/app/vbird_linux]$ cat pay.txt
Name 1st 2nd 3th
VBird 230002400025000
DMTsai 210002200023000
Bird2 430004200041000
[[email protected]/vbird_linux]$ 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}'
Name 1st 2nd 3th Total
VBird 23000240002500072000.00
DMTsai 21000220002300066000.00
Bird2 430004200041000126000.00
在使用過程中需要注意以下幾點:
- 所有awk動作,如果需要多個命令輔助時,可利用分號“;”間隔,或者直接以Enter換行。
- 格式化輸出時,要加上\n,才能進行分行
awk高階特性
awk還有很多高階特性,如if、迴圈等。暫時先不接觸,把基礎用熟練了再說。
PS:本文章內容學習自《鳥哥的linux私房菜 基礎學習篇(第三版)》,文章中的所有例項都是親手操作,保證有效。