1. 程式人生 > >awk學習筆記(二)

awk學習筆記(二)

出現次數 begin 元素 語法 conf 模糊 默認 統計 gin

一、awk流程控制
1.分支結構
if
語法 單分支-if(判斷){指令}
雙分支-if(判斷){指令}else{指令}
多分支-if(判斷){指令}else if(判斷){指令}else{指令}
例子 監控某網卡收發流量
ifconfig eth0 |awk ‘BEGIN{print "接收流量","發送流量"}/bytes/{if($1=="RX"){x=$5}else{y=$5}}END{print x,y}‘
思路 先將接收和發送流量對應的列找出來,因為在同一列,要打印出不同的值,需要增加條件,分別用不同的變量儲存那一列的值

2.循環結構
while

語法 while(判斷){指令}
例子(求詞頻)
1)統計/etc/passwd下的root有多少個
awk -F: ‘{i=1;while(i<=NF){if($i~/root/){x++};i++}}END{print x}‘ /etc/passwd

思路 先寫結構,再寫循環,最後組合;用一個變量遍歷列做循環,用一個變量記錄root

結構: awk -F: ‘{}‘ /etc/passwd

循環:
i=1
while(i<=NF){
if($i~/root/){x++}
i++
}
#i負責每行(awk為逐行處理)循環的次數

#將i與列數NF比較,每一列循環一次,直到該行的每一列參數都取遍
#i在第一列的參賽中是否包含root(模糊匹配),是則x+1(x默認0)

二、awk數組
1.定義數組
給數組賦值
格式 :數組名[下標]=元素名
例子 :
awk ‘BEGIN{a[0]=11;a[1]=22}‘
awk ‘{IP[$n]}‘
#數組中未定義的變量,如 a[2] 的值也是默認為0
#將每行第n列的參數分別讀入數組IP的[ ]中,作為數組IP的元素『常用作統計某文件裏每個IP(或者名字之類)(都在某一列)出現了多少次』

2.遍歷數組
用for實現

格式:for(變量 in 數組名){print 數組名[變量]}
例子 找出攻擊者
awk ‘{IP[$1]++}
END{for(i in IP){print i,IP[i]}}‘
/var/log/httpd/access_log
| awk ‘$1>100{print $2}‘

#讀取的不同IP視為數組IP中的不同元素,IP[$1]++即統計每個元素出現的次數(每個元素初值為0,每讀一個IP該元素的值+1)
#在結尾處插入for循環『給 i 賦值為數組IP的不同下標(下標必須由數字組成,可以是IP)』,每當i取一個下標,打印該下標(即IP)和該下標對應的元素的值(出現次數)
#註:用for循環對數組的下標取值操作貌似只能用在awk語句中

awk學習筆記(二)