一、awk的使用html
1.1 基本的awk執行過程面試
#passwd文件的第二行的第一列和第二列正則表達式
[root@xiaojin oldboy]# awk -F ":" 'NR==2{print $1,$2}' /etc/passwd數組
bin xpost
awk 參數 ‘模式{動做}’ 文件測試
awk 參數 ‘條件(找誰){幹啥}’ 文件url
1.2模式匹配:模式與動做server
經過正則表達式做爲模式htm
模擬環境排序
mkdir -p /server/files/
cat >>/server/files/reg.txt<<EOF
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
EOF
##匹配xiaoyu的姓氏和ID號碼
[root@oldboyedu01-nb files]# awk '/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@oldboyedu01-nb files]# awk '/Xiaoyu/{print $1,$2,$3}' reg.txt
Zhang Xiaoyu 390320151
###awk '第2列中包含Xiaoyu' reg.txt
[root@oldboyedu01-nb files]# awk '$2~/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@oldboyedu01-nb files]# awk '$2~/Xiaoyu/{print $1,$2,$3}' reg.txt
Zhang Xiaoyu 390320151
###顯示全部以41開頭的ID號碼的人的全名和ID號碼
[root@oldboyedu01-nb files]# awk '$3~/^41/' reg.txt
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
[root@oldboyedu01-nb files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
###顯示全部ID號碼最後一位數字是1或5的人的全名
[root@oldboyedu01-nb files]# awk '$3~/[15]$/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Wu Waiwai 70271111 :250:80:75
Wang Xiaoai 3515064655 :50:95:135
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
[root@oldboyedu01-nb files]# awk '$3~/[15]$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
###顯示Xiaoyu的捐款.每一個值時都有以$開頭.如$520$200$135
gsub(/目標/,"替換爲何",第幾列)
gsub(/目標/,"替換爲何") == gsub(/目標/,"替換爲何",$0)
[root@oldboyedu01-nb files]# awk '{gsub(/:/,"$",$4)}' reg.txt
[root@oldboyedu01-nb files]# awk '{gsub(/:/,"$",$4);print}' reg.txt
Zhang Dandan 41117397 $250$100$175
Zhang Xiaoyu 390320151 $155$90$201
Meng Feixue 80042789 $250$60$50
Wu Waiwai 70271111 $250$80$75
Liu Bingbing 41117483 $250$100$175
Wang Xiaoai 3515064655 $50$95$135
Zi Gege 1986787350 $250$168$200
Li Youjiu 918391635 $175$75$300
Lao Nanhai 918391635 $250$100$175
[root@oldboyedu01-nb files]# awk '$2~/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@oldboyedu01-nb files]# awk '$2~/Xiaoyu/{gsub(/:/,"$");print}' reg.txt
Zhang Xiaoyu 390320151 $155$90$201
1.3 特殊模式BEGIN和END
BEGIN{} BEGIN裏面的內容,會在awk讀取文件內容以前運行。
用來計算、測試
END{}*** END{}裏面的內容,會在awk讀取完文件的最後一行以後運行。
用來顯示最終結果。
先計算,END顯示結果。
##統計/etc/services文件裏面的空行數量
root@oldboyedu01-nb files]# awk '/^$/{i=i+1}END{print i}' /etc/services
16
[root@oldboyedu01-nb files]# # 先計算END{顯示最終結果}
統計出現多少次 計數
i=i+1 == i++
1.4 awk的數組計算
處理如下文件內容,將域名取出並根據域名進行計數排序處理:(百度和sohu面試題)
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@oldboyedu01-nb files]# cat url.txt
http://www.etiantian.org/index.html
http://www.etiantian.org/1.html
http://post.etiantian.org/index.html
http://mp3.etiantian.org/index.html
http://www.etiantian.org/3.html
http://post.etiantian.org/2.html
[root@oldboyedu01-nb files]# awk -F "[/.]+" '{print $2}' url.txt
www
www
post
mp3
www
post
[root@oldboyedu01-nb files]# awk -F "[/.]+" '{h[$2]=h[$2]+1;print h["www"]}' url.txt
1
2
2
2
3
3
[root@oldboyedu01-nb files]# awk -F "[/.]+" '{h[$2]=h[$2]+1}END{print h["www"],h["post"],h["mp3"]}' url.txt
3 2 1
[root@oldboyedu01-nb files]# awk -F "[/.]+" '{h[$2]=h[$2]+1}END{for(pol in h) print pol,h[pol] }' url.txt
www 3
mp3 1
post 2
總結:
1.awk數組進行統計
i=i+1 == i++ 統計次數 計數
i=i+$n == i+=$n 累計相加 累加
2.awk執行過程
3.awk經過正則做爲模式
4.BEGIN和END特殊模式