AWK是一種處理文本文件的語言,是一個強大的文本分析工具。有統計和計算功能。html
之因此叫AWK是由於其取了三位創始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。面試
選項參數說明: -F fs or --field-separator fs 指定輸入文件折分隔符,fs是一個字符串或者是一個正則表達式,如-F:。 -v var=value or --asign var=value 賦值一個用戶定義變量。 -f scripfile or --file scriptfile 從腳本文件中讀取awk命令。 -mf nnn and -mr nnn 對nnn值設置內在限制,-mf選項限制分配給nnn的最大塊數目;-mr選項限制記錄的最大數目。這兩個功能是Bell實驗室版awk的擴展功能,在標準awk中不適用。 -W compact or --compat, -W traditional or --traditional 在兼容模式下運行awk。因此gawk的行爲和標準的awk徹底同樣,全部的awk擴展都被忽略。 -W copyleft or --copyleft, -W copyright or --copyright 打印簡短的版權信息。 -W help or --help, -W usage or --usage 打印所有awk選項和每一個選項的簡短說明。 -W lint or --lint 打印不能向傳統unix平臺移植的結構的警告。 -W lint-old or --lint-old 打印關於不能向傳統unix平臺移植的結構的警告。 -W posix 打開兼容模式。但有如下限制,不識別:/x、函數關鍵字、func、換碼序列以及當fs是一個空格時,將新行做爲一個域分隔符;操做符**和**=不能代替^和^=;fflush無效。 -W re-interval or --re-inerval 容許間隔正則表達式的使用,參考(grep中的Posix字符類),如括號表達式[[:alpha:]]。 -W source program-text or --source program-text 使用program-text做爲源代碼,可與-f命令混用。 -W version or --version 打印bug報告信息的版本。
其執行過程和sed類似,在咱們遇到複雜的語句時,能夠離利用執行過程來理解正則表達式
題目:passwd文件的第二行的第一列和第二列數組
[root@luffy-001 oldboy]# awk -F ':' 'NR==2{print $1,$2}' /etc/passwd bin x
awk 參數 ‘模式{動做}’ 文件函數
awk 參數 ‘條件(找誰){幹啥}’ 文件工具
awk執行過程簡圖post
怎麼找到這一行,而後作點什麼測試
建立測試環境this
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
找出包含數字1的行url
[root@luffy-001 files]# sed -n '/1/p' reg.txt Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201 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@luffy-001 files]# awk '/1/' reg.txt Zhang Dandan 41117397 :250:100:175 Zhang Xiaoyu 390320151 :155:90:201 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
awk支持的正則表達式
|
題目:顯示xiaoyu的姓氏和ID號碼
[root@luffy-001 files]# awk '/Xiaoyu/' reg.txt Zhang Xiaoyu 390320151 :155:90:201 [root@luffy-001 files]# awk '/Xiaoyu/{print $1,$2,$3}' reg.txt 至關於$0~,$0 在awk中表示這一行,整行記錄 Zhang Xiaoyu 390320151 [root@luffy-001 files]# awk '$2~/Xiaoyu/{print $1,$2,$3}' reg.txt 波浪線表示包含,第二列包含xiaoyu的行 的第一列,第二列,第三列 Zhang Xiaoyu 390320151
題目:顯示全部以41開頭的ID號碼的人的全名和ID號碼
[root@luffy-001 files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt Zhang Dandan 41117397 Liu Bingbing 41117483
題目:顯示全部ID號碼最後一位數字是1或5的人的全名
[root@luffy-001 files]# awk '$3~/[15]$/{print $1,$2}' reg.txt Zhang Xiaoyu Wu Waiwai Wang Xiaoai Li Youjiu Lao Nanhai [root@luffy-001 files]# awk '$3~/(1|5)$/{print $1,$2}' reg.txt Zhang Xiaoyu Wu Waiwai Wang Xiaoai Li Youjiu Lao Nanhai
題目:顯示Xiaoyu的捐款.每一個值時都有以$開頭.如$520$200$135
gsub的用法:
gsub(/目標/,"替換爲何",第幾列)
gsub(/目標/,"替換爲何") == gsub(/目標/,"替換爲何",$0)
[root@luffy-001 files]# sed 's#:#$#g' 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@luffy-001 files]# awk '{gsub(/:/,'$',$4);print}' reg.txt awk: {gsub(/:/,,$4);print} awk: ^ syntax error awk: fatal: 0 is invalid as number of arguments for gsub [root@luffy-001 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@luffy-001 files]# awk '$2~/Xiaoyu/{gsub(/:/,"$",$4);print}' reg.txt Zhang Xiaoyu 390320151 $155$90$201
BEGIN{} BEGIN裏面的內容,會在awk讀取文件內容以前運行。
測試,計算。
END{}*** END{}裏面的內容,會在awk讀取完文件的最後一行以後運行。
用來顯示最終結果。
先計算,END顯示結果。
[root@luffy-001 files]# awk 'BEGIN{print "this is kt"} {print NR,$0}' reg.txt this is kt 1 Zhang Dandan 41117397 :250:100:175 2 Zhang Xiaoyu 390320151 :155:90:201 3 Meng Feixue 80042789 :250:60:50 4 Wu Waiwai 70271111 :250:80:75 5 Liu Bingbing 41117483 :250:100:175 6 Wang Xiaoai 3515064655 :50:95:135 7 Zi Gege 1986787350 :250:168:200 8 Li Youjiu 918391635 :175:75:300 9 Lao Nanhai 918391635 :250:100:175 [root@luffy-001 files]# awk 'BEGIN{print "this is kt"} END{print "this is kb"} {print NR,$0}' reg.txt this is kt 1 Zhang Dandan 41117397 :250:100:175 2 Zhang Xiaoyu 390320151 :155:90:201 3 Meng Feixue 80042789 :250:60:50 4 Wu Waiwai 70271111 :250:80:75 5 Liu Bingbing 41117483 :250:100:175 6 Wang Xiaoai 3515064655 :50:95:135 7 Zi Gege 1986787350 :250:168:200 8 Li Youjiu 918391635 :175:75:300 9 Lao Nanhai 918391635 :250:100:175 this is kb
題目:統計/etc/services文件裏面的空行數量
[root@luffy-001 files]# awk '/^$/{print NR}' /etc/services 22 266 299 320 326 393 461 474 479 486 494 506 512 518 583 584 [root@luffy-001 files]# awk '/^$/{i=i+1;print i}' /etc/services 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 [root@luffy-001 files]# awk '/^$/{i=i+1} END{print i}' /etc/services 16
統計出現多少次 計數
i=i+1 ===> i++
##用法一: awk '{[pattern] action}' {filenames} # 行匹配語句 awk '' 只能用單引號 ##用法二: awk -F #-F至關於內置變量FS, 指定分割字符 ##用法三: awk -v # 設置變量 ##用法四: awk -f {awk腳本} {文件名}
舉個例子:
[root@luffy-001 files]# awk 'BEGIN{h[110]="張三";h[114]="XXOO";print h[110],h[114]}' 張三 XXOO
運算符
運算符 描述 = += -= *= /= %= ^= **= 賦值 ?: C條件表達式 || 邏輯或 && 邏輯與 ~ ~! 匹配正則表達式和不匹配正則表達式 < <= > >= != == 關係運算符 空格 鏈接 + - 加,減 * / % 乘,除與求餘 + - ! 一元加,減和邏輯非 ^ *** 求冪 ++ -- 增長或減小,做爲前綴或後綴 $ 字段引用 in 數組成員
題目:處理如下文件內容,將域名取出並根據域名進行計數排序處理:(百度和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@luffy-001 files]# awk -F '[/.]+' '{print $2}' url.txt www www post mp3 www post ## 使用h[$2]創建數組,並自加,打印出其中一個 [root@luffy-001 files]# awk -F '[/.]+' '{h[$2]++;print h["www"]}' url.txt 1 2 2 2 3 3 ## 答應全部的結果,只是當種類多了以後,無法操做 [root@luffy-001 files]# awk -F '[/.]+' '{h[$2]++} END{print h["www"],h["post"],h["mp3"]}' url.txt 3 2 1 ## awk獨有的循環的功能 [root@luffy-001 files]# awk -F '[/.]+' '{h[$2]++} END{for(pol in h) print pol,h[pol]}' url.txt www 3 mp3 1 post 2
題目:統計access.log文件中每一個ip地址出現的次數
題目:secure系統日誌分析練習
誰在破解你的密碼(Failed password 每一個ip地址出現的次數)
分析系統的每一個用戶被破解的次數
## 統計IP登陸次數 [root@luffy-001 log]# awk '$0~/Accepted/{h[$11]++}END{for(por in h) print por,h[por]}' secure 10.0.0.1 3## 統計每一個用戶被破解的次數[root@luffy-001 log]# awk '$0~/FAILED LOGIN/{h[$12]++}END{for(por in h) print por,h[por]}' securerot, 1## 統計誰在破解你的密碼(Failed password 每一個ip地址出現的次數)[root@luffy-001 log]# awk -F "[()]" '/FAILED/{h[$2]++}END{for(pol in h) print pol, h[pol]}' securenull 1