awk執行過程、模式、數組
作者:Georgekai
歸檔:學習筆記
2018/1/12
本章正題:awk執行過程、模式、數組
1.1 awk
1. awk:全稱就是gawk
2. 查看awk版本: awk --version
3. awk '找誰{幹啥}'
找誰:模式pattern 幹啥:動作action
1.1.1 awk執行過程
1.2 awk的模式:正則表達式作為模式、比較表達式作為模式NR>10、範圍模式、
特殊模式BEGIN和END
1.2.1 正則表達式作為模式
^ :在awk中表示某一列中以什麽什麽開頭的行,如:$3~/^root/就是查找第三列以 root開 頭的行
~ :表示匹配後面的條件
!~:表示不匹配的意思
例1:找出第三列中包含連續的數字0的行
[root@georgekai files]# awk '$3~/0+/{print $0}' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
註:表示在第三列中匹配出條件為連續0的行
例2:找出第三列中連續出現倆次及以上0的行
[root@georgekai files]# awk --re-interval '$3~/0{2,}/{print $0}' reg.txt
Meng Feixue 80042789 :250:60:50
例3:顯示小於的姓氏和ID號碼
[root@georgekai files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
Zhang 390320151
註:1.awk '/Xiaoyu/' reg.txt == 相當於'$0~/Xiaoyu/'
2.$0表示這一行的所有
例3:姓氏Zhang的人,顯示他的第二次捐款金額及他的名字
方法一:
[root@georgekai files]# awk -F "[: ]+" '$1~/Zhang/{print $2,$5}' reg.txt
Dandan 100
Xiaoyu 90
方法二:
[root@georgekai files]# awk -F "[: ]+" '$1~/Zhang/{print $2,$(NF-1)}' reg.txt
Dandan 100
Xiaoyu 90
註:NF-1相當於倒數第二行
例4:顯示所有以41開頭的ID號碼的人的全名和ID號碼
[root@georgekai files]# awk -F "[ :]+" '$3~/^41/{print $1,$2,$(NF-3)}' reg.txtZhang Dandan 41117397
Liu Bingbing 41117483
例5:顯示所有ID號碼最後以為數字是1或5的人的全名
[root@georgekai files]# awk -F "[ :]+" '$3~/[15]$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
註:也可以用(1|5)$,1$|5$
例6;顯示Xiaoyu的捐款,數額都以$開頭,如$520$200$135
方法一:利用tr做替換
[root@georgekai files]# awk -F "[ ]+" '$2~/Xiaoyu/{print $NF}' reg.txt|tr ':' '$'
$155$90$201
方法二:(awk中的替換)gsub
[root@georgekai files]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$NF);print $0}' reg.txt
註:1.語法:gsub函數:gsub(/你要什麽/,“替換成什麽”,去第幾列)
awk '{gsub(/:/,"$",$NF);print $0}' reg.txt
2.也可以省略後面的逗號和$NF
1.2.2 awk的特殊模式BEGIN{}和END{}
1. BEGIN{} 裏面的內容會在awk讀取文件之前執行
2. BEGIN{}作用:測試,計算,修改awk內置變量
3. awk裏面的內置變量
1)字段分隔符:-F === 相當於修改FS(field separator)
-F ":" == BEGIN{FS=":"} == -vFS":"
2)NR:行號 $0
3)NF :number of field 每一行有多少列
4. END{} 裏面的內容會在awk讀取完文件內容之後運行
註:一般用來先計算,再顯示END輸出的最終結果
END的效果:
[root@georgekai files]# awk '{print $0}END{print "Bey"}' reg.txt
Zhang Dandan 41117397 :250:100:175
Lao Nanhai 918391635 :250:100:175
Bey
例1:統計/etc/services文件中空行數量
方法一:grep -c 統計:
[root@georgekai files]# grep -c '^$' /etc/services
16
方法二:awk i=i+1統計
[root@georgekai files]# awk '/^$/{i=i+1;print i}' /etc/services
註:最開始的時候,i=0 ,一個{}中,多條命令用分號分割
公式:1.i=i+1 或 i++ (用於技術)
2.sum=sum+$n sum總數
3.i=i+$n 或i+=$n (計算總和,累加)$n表示第幾列
方法三:先計算,END顯示最終結果
[root@georgekai files]# awk '/^$/{i++}END{print i}' /etc/services
16
例2:統計出/etc/passwd 中有多少個虛擬用戶
[root@georgekai files]# awk -F "[:]+" '$NF~/nologin/{i++}END{print i}' /etc/passwd
24
例3:seq 10 統計1到10數字的相加
[root@georgekai files]# seq 10 |awk '{i=i+$0}END{print i}'
55
[root@georgekai files]# seq 10|awk '{sum=sum+$1}END{print sum}'
55
1.3 awk數組
awk數組的組成:
數組的名字+[元素]=元素內容
例1:顯示出www的執行過程
例2:顯示出元素內容中www、post、mp3各出現了多少次:
[root@georgekai files]# awk -F "[/.]+" '{h[$2]++}END{print h["www"],h["post"],h["mp3"]}' hotel.log
3 2 1
註:h["www"]的結果就是3,h["pst"]就是2,h["mps"]就是1
[root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h ) print pol,h[pol]}' url.txt
www 3
mp3 1
post 2
註:for循環中,pol就代表$2中的某一行,h就是數組的名稱,pol in h 就是h[pol],相當於h[$2中某一 行],print pol就是輸出$2中每一行的內容,print h[pol]就是元素的內容,相當於h[pol]++的結果(因 為有END,所以只顯示最後統計的數)
例3:統計誰在破解你的密碼
[root@oldboyedu43-lnb files]# awk '/Failed password/{h[$(NF-3)]++}END{for( pol in h ) print pol,h[pol]}' secure-20161219 |sort -rnk2 |column -t
218.65.30.25 68652
218.65.30.53 34326
218.87.109.154 21201
112.85.42.103 18065
註:column -t 顯示順序,sort進行排序,-r逆序,-n把內容當做數字進行排序,-k2給第二列排序
例4:哪個用戶破解的次數最多
[root@georgekai files]# awk '/Failed pas/{h[$(NF-5)]++}END{for ( wk in h ) print wk,h[wk]}' secure-20161219|sort -rnk2|column -t
註:只需元素換成要用戶那一列即可
awk執行過程、模式、數組