1.12html
linux三劍客之awk用法詳解linux
內容:正則表達式
1. awk執行過程數組
2. awk命令格式ssh
3. awk用法ide
4. awk數組函數
一直讀取到文件的最後一行post
‘模式{動做}’測試
模式 pattern 動做 actionthis
正則表達式
比較表達式 NR>10
範圍模式
特殊模式BEGIN{}和END{}
awk支持正則中的特殊符號
測試文件/server/files/reg.txt
[root@oldboy-gao files]# cat 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
練習:找出第三列包含連續數字0
awk '$3 ~/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
~ 匹配 包含
!~ 不匹配 不包含
實例3-1 顯示Xiaoyu的姓氏和ID號
條件:第二列中包含Xiaoyu
動做:顯示哪一列
[root@oldboy-gao files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
Zhang 390320151
比較:‘/Xiaoyu/’與’$2~/Xiaoyu/’區別
[root@oldboy-gao files]# awk '$2~/Xiaoyu/{print $1,$3}' reg.txt
Zhang 390320151
‘/Xiaoyu/’與’$2~/Xiaoyu/’區別
‘/Xiaoyu/’表示這一行中有Xiaoyu ===’$0~/Xiaoyu/’
’$2~/Xiaoyu/’ 表示第2列中有Xiaoyu
實例3-2 找出姓Zhang的人第二次捐款及其姓氏
[root@oldboy-gao files]# awk -F '[ :]+' '$1 ~/Zhang/{print $1,$5}' reg.txt
Zhang 100
Zhang 90
逆向思惟 --倒數第幾行
[root@oldboy-gao files]# awk -F '[ :]+' '$1 ~/Zhang/{print $1,$(NF-1)}' reg.txt
Zhang 100
Zhang 90
實例3-3 顯示全部以41開頭的ID號碼的人的全名和ID號碼
[root@oldboy-gao files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
實例3-4 顯示全部ID號碼最後一位數字是1或5的人的全名
[root@oldboy-gao files]# awk '$3~/[15]$/{print $1,$2}' reg.txt
Zhang Xiaoyu
Wu Waiwai
Wang Xiaoai
Li Youjiu
Lao Nanhai
[root@oldboy-gao files]# awk '$2 ~ /Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt
$155$90$201
gsub函數 格式/用法
{grup(/你要找什麼/,」替換成什麼」,在第幾列)}
grup(/你要找什麼/,」替換成什麼」)=====grup(/你要找什麼/,」替換成什麼」,$0) 默認找整行
awk裏面的內置變量
[root@oldboy-gao ~]# awk 'BEGIN{print "this is beginning"}{print $0}' /server/files/reg.txt
this is beginning 在awk讀取文件以前運行
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
BEGIN{}:經常使用來測試 計算 修改 awk內置變量
先計算,END輸出最終結果
[root@oldboy-gao ~]# awk '{print $0}END{print "end of file"}' /server/files/reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
end of file 在awk讀取完文件內容以後運行
做用:顯示計算的最終結果
FS
-F ==修改FS內置變量(filed separator)
-F」:」 ==BEGIN{FS=」:」} ===-vFS=」:」
-v 指定變量 linux與awk的橋樑
NR 行號
NR NF 別改變量
NF number of field 每一行有多少列
實例3-1 統計/etc/services文件中空行數量
[root@oldboy-gao files]# egrep '^$' /etc/services |wc -l
16
[root@oldboy-gao files]# grep -c '^$' /etc/services
16 -c 統計行數
i=i+1 === i++ 統計次數 每次加一 計數
i=i+$0 ==i+=$0 計算總和 累加
awk '/^$/{i++;print i}' /etc/services
1
2 awk 中使用變量 直接寫 直接用 不須要$
...
15
16
前面先計算 END顯示最終結果
[root@oldboy-gao files]# awk '/^$/{i++}END{print i}' /etc/services
16
實例3-2 統計/etc/passwd中有多少個虛擬用戶
[root@oldboy-gao files]# awk -F '[:]' '$NF~/nologin/{i++}END{print i}' /etc/passwd
20
實例3-3 計算 seq 10 i=i+$0 計算總和 累加
[root@oldboy-gao files]# seq 10|awk '{sum=sum+$0}END{print sum}'
55
以行爲單位執行
數組的名字[元素]=」元素內容」
統計誰 中括號裏寫誰
測試用BENGIN{}
[root@oldboy-gao ~]# awk 'BEGIN{h[110]="UFO";h[114]="haha";print h[110],h[114]}'
UFO haha
實例5-1 處理如下文件內容,將域名取出並根據域名進行計數排序處理
[root@oldboy-gao files]# cat /server/files/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@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{print h["www"],h["post"],h["mp3"]}' url.txt
3 2 1
簡便
[root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h ) print pol}' url.txt
www
mp3
post
[root@oldboyedu43-lnb files]# awk -F "[/.]+" '{h[$2]++}END{for( pol in h ) print pol,h[pol]}' url.txt
www 3 pol(變量-包工頭)-表明三個變量 www mp3 post
mp3 1 h[pol]變量的內容
post 2
單獨取某一變量內容
[root@oldboy-gao files]# awk -F "[/.]+" '{h[$2]++}END{for(pol in h)print h["www"]}' url.txt
3 思想:awk工做以行爲單位
3
3
[root@oldboy-gao files]# awk -F "[/.]+" '{h[$2]++}END{for(pol in h)print h["post"]}' url.txt
2
2
2
數組工做過程/原理
[root@oldboy-gao files]# awk -F "[/.]+" '{h[$2]++;print $2,h["www"]}' url.txt|column -t 元素 統計www
www 1 符合 h[$2]=0+1=1
www 2 符合 h[$2]=1+1=2
post 2 不符合
mp3 2 不符合
www 3 符合 h[$2]=2+1=3
post 3 不符合
文件環境/oldboy/awklx/secure
[root@oldboy-gao files]# tail /oldboy/awklx/secure-20161219
Dec 19 03:41:56 localhost sshd[9025]: Failed password for root from 59.63.166.84 port 58082 ssh2
Dec 19 03:41:57 localhost sshd[9025]: Failed password for root from 59.63.166.84 port 58082 ssh2
Dec 19 03:41:57 localhost sshd[9025]: Failed password for root from 59.63.166.84 port 58082 ssh2
實例5-2 統計誰在破解你的密碼 --重點
[root@oldboy-gao files]# awk '/Failed/{h[$(NF-3)]++}END{for(gao in h)print gao,h[gao]}' /oldboy/awklx/secure-20161219|column -t|sort -rnk2
218.65.30.25 68652 h[$(NF-3)] 酒店--元素[倒數第四列]
218.65.30.53 34326 END{for(gao in h) 循環
218.87.109.154 21201 print gao,h[gao]} 顯示變量內容,顯示房間內容
112.85.42.103 18065 column -t 每列對齊
112.85.42.99 17164 sort -rnk2 排序 倒序 把內容當作數字 指定按列
實例5-3 統計哪一個用戶被破解的次數最多
[root@oldboy-gao awklx]# awk '/Failed/{h[$(NF-5)]++}END{for(pol in h)print pol,h[pol]}' secure-20161219|grep 'root'
root 364610