1. 程式人生 > >awk基礎篇——Shell 文字處理利器

awk基礎篇——Shell 文字處理利器

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

在使用過程中需要注意以下幾點:

  1. 所有awk動作,如果需要多個命令輔助時,可利用分號“;”間隔,或者直接以Enter換行。
  2. 格式化輸出時,要加上\n,才能進行分行

awk高階特性

awk還有很多高階特性,如if、迴圈等。暫時先不接觸,把基礎用熟練了再說。

PS:本文章內容學習自《鳥哥的linux私房菜 基礎學習篇(第三版)》,文章中的所有例項都是親手操作,保證有效。