awk '/pattern/ { actions }' filename
你一般會發現腳本中的模式(/pattern/)是一個正則表達式,此外,你也能夠在這裏用特殊模式 BEGIN 和 END。所以,咱們也能按照下面的形式編寫一條 awk 命令:mysql
awk 'BEGIN { actions } /pattern/ { actions } /pattern/ { actions }...END { actions }' filenames
語法結構以下圖:
其中:BEGIN END是AWK的關鍵字部,所以必須大寫;這兩個部分開始塊和結束塊是可選的正則表達式
特殊模塊:
BEGIN語句設置計數和打印頭部信息,在任何動做以前進行
END 語句輸出統計結果,在完成動做以後執行sql
awk經過Pattern(模式)來控制是否處理當前記錄,若是當前記錄和Pattern匹配,則執行Action(操做)。在awk中,有下列幾種模式:數組
一、正則表達式 二、關係表達式 三、組合的Pattern 四、Pattern1,Pattern2 五、BEGIN 六、END
爲了說明以上各類模式,咱們這裏準備一個文件score.txt,以實例的方式一一進行說明,score.txt文件內容以下:ide
[root@ecs-c13b awk]# cat score.txt guojing 85 92 78 zhaoyun 89 90 75 sanfeng 84 88 80 guanyu 83 78 90 liubei 86 88 79
[root@ecs-c13b awk]# awk '/9[0-9]/ {print $0}' score.txt guojing 85 92 78 zhaoyun 89 90 75 guanyu 83 78 90
以上指令查詢有一門課成績在[90-99]區間的學生的成績信息,/9[0-9]/部分即爲awk程序指令中的Pattern,這裏Pattern的類型爲正則表達式。學習
awk '$3 ~ /9[0-9]/ {print $0}' score.txt zhaosan 85 92 78 lisheng 89 90 75
這條指令在上一條指令的基礎上增長了限制,須要第二門課(數學)成績在[90-99]區間纔可與模式匹配。這裏的 ~ 操做符用來表示變量是否與正則表達式匹配,若是要判斷不匹配,可使用 !~ 操做符。測試
awk '$3 >= 90 {print $0}' score.txt zhaosan 85 92 78 lisheng 89 90 75
可用來造成模式關係運算符包括: <(小於)、>(大於)、<=(小於或等於)、>=(大於或等於)、= =(等於)和 ! =(不等於)。ui
這條指令的做用也是查詢數學成績在90分以上的學生成績信息,不過比正則表達式中的範圍要大一點,這裏100分也是符合模式的。命令行
awk '$3 >= 90 && $3 < 100 {print $0}' score.txt zhaosan 85 92 78 lisheng 89 90 75
布爾運算符 ||(或)&&(和)以及 !(不)將模式組合,組合後若是求值爲真則模式匹配,不然不匹配。這裏就解決了關係表達式示例中包含了100的問題。excel
awk 'FNR == 2 , FNR == 4 {print $0}' score.txt lisheng 89 90 75 zhaoyun 84 88 80 guanyu 83 78 90
其實這個也能夠歸爲組合的模式中,只是這種模式比較特殊,故單獨列出。以,(逗號)隔開的兩個Pattern指定一個範圍,對從匹配第一個Pattern的記錄開始,到匹配第二個Pattern結束的全部記錄執行Action
BEGIN模塊在awk讀取文件以前就執行,通常用來定義咱們的內置變量(預約義變量,eg:FS,RS)能夠輸出表頭(excel表格名稱)
BEGIN模式以前在實例中提到,自定義變量,給內容變量賦值等,都是使用過。須要注意的是BEGIN模式後面要結合一個action操做塊,包含在大括號內。
awk必須在對輸入文件進行任何處理前先執行BEGIN定義的action操做塊。咱們能夠不要任何輸入文件,就能夠對BEGIN模塊進行測試,由於awk須要先執行完BEGIN模式,纔對輸入文件作處理。BEGIN模式經常被用來修改內置變量ORS,RS,FS,OFS,等的值。
假如咱們要將學生成績表打印出來,那總得加點表頭什麼的吧,就能夠放到BEGIN中了。
awk 'BEGIN { print "Print student score table"} {print $0}' score.txt Print student score table zhaosan 85 92 78 lisheng 89 90 75 zhaoyun 84 88 80 guanyu 83 78 90 liubei 86 88 79
ifconfig eth0|awk -F '(addr:)|(Bcast:)' 'NR==2{print $2}'ifconfig eth0|awk -F '[: ]+' 'NR==2{print $4}'ifconfig eth0|awk -F '[^0-9.]+' 'NR==2{print $2}'
也能夠寫成
ifconfig eth0|awk 'BEGIN{FS="(addr:)|(Bcast:)"} NR==2{print $2}'ifconfig eth0|awk 'BEGIN{FS="[^0-9.]+"} NR==2{print $2}'ifconfig eth0|awk 'BEGIN{FS="[: ]+"} NR==2{print $4}'
注意:命令行 -F 本質就是修改FS的變量。
END 在awk讀取完全部的文件的時候,再執行END模塊,通常用來輸出一個結果(累加,數組的結果)也能夠是和BEGIN模塊相似的結尾標識信息。
awk 'END { print "Work done"} {print $0}' score.txt zhaosan 85 92 78 lisheng 89 90 75 zhaoyun 84 88 80 guanyu 83 78 90 liubei 86 88 79 Work done
統計數量: grep -c 或 awk
[root@mysql-master ~]# awk '/^$/{print $0}' /etc/services |wc -l16[root@mysql-master ~]# grep -c '^$' /etc/services16[root@mysql-master ~]# awk '/^$/{i++}END{print i}' /etc/services16[root@mysql-master ~]# awk '/^$/{i=i+1}END{print i}' /etc/services16
awk -F: 'BEGIN { print "用戶名 UID"} END { print "the over"} $3>500{print $1,$3}' /etc/passwd
補充:awk中變量使用
直接定義,直接使用便可。
awk中字母會被認爲是變量,若是真的要給一個變量賦值使用雙引號
[root@mysql-master ~]# awk 'BEGIN{ a=123asdf;print a}' #awk中字母會被認爲是變量123[root@mysql-master ~]# awk 'BEGIN{ a="123asdf";print a}' #awk中給變量賦值要加雙引號;使用變量直接使用便可123asdf