awk 範例二

  1. gawk 查看輔助說明的最後一段,有兩個範例。
    [dywang@dywmac zzz]$ gawk -W help | grep ^Example -A2
    Examples:
    	gawk '{ sum += $1 }; END { print sum }' file
    	gawk -F: '{ print $1 }' /etc/passwd
    
  2. 使用第二範例:/etc/passwd 以冒號 ":" 作為欄位的分隔,列出第一欄位(帳號名稱)及第三欄位(uid)。
    [dywang@dywmac zzz]$ gawk -F: '{print $1 "\t" $3}' /etc/passwd | head -4
    root	0
    bin	1
    daemon	2
    adm	3
    
  3. 如果不使用 -F 選項指定 passwd 以冒號 ":" 作為欄位的分隔,而是在單引號內,也就是 awk 程式本身設定分隔符號,則執行結果如下,第一行還是以「空白」做為分隔符號,所以無法正確輸出。
    [dywang@dyw219 zzz]$ gawk 'FS=":" {print $1 "\t" $3}' /etc/passwd | head -4
    root:x:0:0:root:/root:/bin/bash	
    bin	1
    daemon	2
    adm	3
    
  4. awk 的 END 是指先執行所有行數,再進行下一個動作,BEGIN 則是先做設定或處理再執行下一個動作。所以 FS=":" 的設定以 BEGIN 先設定就可以解決第一行輸出不正確的問題。
    [dywang@dyw219 zzz]$ gawk 'BEGIN{FS=":"} {print $1 "\t" $3}' /etc/passwd | head -4
    root	0
    bin	1
    daemon	2
    adm	3
    
  5. awk 的邏輯運算字元
    運算單元 代表意義
    > 大於
    < 小於
    >= 大於或等於
    <= 小於或等於
    == 等於
    != 不等於
  6. 查閱第三欄 uid 大於等於 500 的帳號
    [dywang@dywmac zzz]$ gawk 'BEGIN{FS=":"} $3<=4 {print $1 "\t" $3}' /etc/passwd
    root	0
    bin	1
    daemon	2
    adm	3
    lp	4
    
  7. 查閱第三欄 uid 大於等於 500 的帳號
    [dywang@dywmac zzz]$ gawk 'BEGIN{FS=":"} $3>=500 {print $1 "\t" $3}' /etc/passwd
    nfsnobody	65534
    dywang	500
    mockbuild	502
    linda	503
    
  8. 「查閱第三欄 uid 大於等於 500 的帳號」的 awk 程式寫在 passwd.awk。
    [dywang@dywIssd zzz]$ vim passwd.awk
    [dywang@dywIssd zzz]$ cat passwd.awk
    BEGIN{
    	FS=":"
    } 
    $3>=500 {
    	print $1 "\t" $3
    }
    
  9. 執行 awk 以選項指定程式在 passwd.awk,一樣可以達到要求。
    [dywang@dywIssd zzz]$ awk -f passwd.awk /etc/passwd
    nfsnobody	65534
    dywang	500
    linda	501