1. 程式人生 > >awk執行過程、模式、數組

awk執行過程、模式、數組

ogr height ice ble left sort none center sha


作者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、範圍模式、

特殊模式BEGINEND

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 === 相當於修改FSfield separator

-F ":" == BEGIN{FS=":"} == -vFS":"

2NR:行號 $0

3NF :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執行過程、模式、數組