1.12-linux三劍客之awk用法詳解

1.12html

linux三劍客之awk用法詳解linux

內容:正則表達式

1. awk執行過程數組

2. awk命令格式ssh

3. awk用法ide

4. awk數組函數

第1章 awk執行過程

圖片1.png 

一直讀取到文件的最後一行post

第2章 awk 找誰{幹啥}

                模式{動做}測試

模式 pattern   動做  actionthis

第3章 awk中什麼能夠做爲模式

正則表達式

比較表達式    NR>10

範圍模式

特殊模式BEGIN{}END{}

 

awk支持正則中的特殊符號

3.1 正則表達式

測試文件/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號碼最後一位數字是15的人的全名

[root@oldboy-gao files]# awk '$3~/[15]$/{print $1,$2}' reg.txt

Zhang Xiaoyu

Wu Waiwai

Wang Xiaoai

Li Youjiu

Lao Nanhai

3.1.1 顯示Xiaoyu的捐款,每一個值時都有以$開頭,$520$200$135 

 awk怎麼替換---awk{gsub}

[root@oldboy-gao files]# awk '$2 ~ /Xiaoyu/{gsub(/:/,"$",$NF);print $NF}' reg.txt

$155$90$201

gsub函數  格式/用法

{grup(/你要找什麼/,替換成什麼,在第幾列)}   

grup(/你要找什麼/,替換成什麼)=====grup(/你要找什麼/,替換成什麼,$0)  默認找整行

3.2 特殊模式  BEGIN{}END{}

3.2.1 BEGIN{}   裏面的內容會在awk讀取文件以前執行

                   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內置變量

3.2.2 END{}  END{} 裏面的內容會在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讀取完文件內容以後運行

做用:顯示計算的最終結果

 

3.2.3 awk內置變量

FS

-F  ==修改FS內置變量(filed separator)

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

  -v 指定變量    linuxawk的橋樑

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                      

第4章 awk完整執行過程

以行爲單位執行

圖片2.png 

第5章 awk數組

5.1 awk數組的組成

數組的名字[元素]=元素內容   

統計誰  中括號裏寫誰

圖片3.png 

 

測試用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

相關文章
相關標籤/搜索