1. 程式人生 > >AWK和CUT

AWK和CUT

awk是一個強大的文字分析工具,相對於grep的查詢,sed的編輯,awk在其對資料分析並生成報告時,顯得尤為強大。簡單來說awk就是把檔案逐行的讀入,以空格為預設分隔符將每行切片,切開的部分再進行各種分析處理。

awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母。實際上 AWK 的確擁有自己的語言: AWK 程式設計語言 , 三位建立者已將它正式定義為“樣式掃描和處理語言”。它允許您建立簡短的程式,這些程式讀取輸入檔案、為資料排序、處理資料、對輸入執行計算以及生成報表,還有無數其他的功能。


 AWK的三種使用方式

1.命令列方式
awk [-F  field-separator]  'commands'  input-file(s)
其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的檔案。
在awk中,檔案的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,預設的域分隔符是空格。

2.shell指令碼方式
將所有的awk命令插入一個檔案,並使awk程式可執行,然後awk命令直譯器作為指令碼的首行,一遍通過鍵入指令碼名稱來呼叫。
相當於shell指令碼首行的:#
!/bin/sh 可以換成:#!/bin/awk 3.將所有的awk命令插入一個單獨檔案,然後呼叫: awk -f awk-script-file input-file(s) 其中,-f選項載入awk-script-file中的awk指令碼,input-file(s)跟上面的是一樣的。
 
 
awk的資料欄位變數
$0表示整行文字
$1表示文字中第一個資料欄位
$2表示文字中第二個資料欄位
$n表示文字中第n個數據欄位
awk的用-F來指定分隔符
預設的欄位分隔符是任意空白字元(空格或者TAB)
 
 
awk命令的操作符
正則表示式和bash一致
數學運算:+,-,*,/, %,++,- -
邏輯關係符:&&, ||, !
比較操作符:>,<,>=,!=,<=,==  ~ !~
文字資料表示式:== (精確匹配)
~波浪號表示匹配後面的模式
 
 
AWK 的用法例項
# tail -5 /etc/passwd  <<取出前五行
saslauth:x:498:76:"Saslauthd user":/var/empty/saslauth:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
pulse:x:497:496:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
 
 
# tail -5 /etc/passwd |awk -F ':' '{print $1}'  <<以:為分隔符取出前五行的第一列(取出使用者名稱)
saslauth
postfix
pulse
sshd
tcpdump
 
 
# awk -F: '$3>=500{print $1}' /etc/passwd  
 顯示UID大於500的使用者名稱
#awk -F: '$3 != $4 {print $1}' /etc/passwd 
顯示UID不等於GID的使用者名稱
#awk -F: '/^h/ && /bash/{print $1}' /etc/passwd
顯示使用者名稱以h開頭且包含hash欄位的普通使用者