標籤:awk的使用---業務需求
awk是按照流來處理的,所以處理1-5G的文本資料相對還是可以的!
規定日誌格式
$17 為domainname
$19 為request
$21 為響應狀態代碼
應用1: 匹配統計F5日誌中,含有某個網域名稱的數量
可以按照以下方法來套
[[email protected] scripts]# awk -F: ‘$1=="root" {print $0}‘ /etc/passwd | wc -l1
對以上進行改版,因為統計的時候利用了wc -l 進行了,現在不需要wc -l ,awk完成統計
[[email protected] scripts]# awk -F: -v n=0 ‘{if($1=="root") n++;} END{print n}‘ /etc/passwd 1
-v 可以指定變數,在 awk ‘‘中利用變數的時候直接使用,不需要"$n" 這個地方要區別shell
注意: 以下語句,預設不指定n變數的時候,雖然可以出結果,是因為在n++的時候會預設設定n為0,但是這樣會出現bug,當沒有匹配的時候,去大於n的時候就不是0而是空
[[email protected] scripts]# awk -F: ‘{if($1=="root") n++;} END{print n}‘ /etc/passwd 1
bug:
[[email protected] scripts]# awk -F: ‘{if($1=="rooot") n++;} END{print n}‘ /etc/passwd [[email protected] scripts]#
應用2: 使用shell中的變數和定義多變數 和邏輯運算子
&& 邏輯與
~ 匹配字串
-v key1=value1 -v key2-values
原型:
awk -v t=0 -vdomain="$domain" -v request="/main/detail" -v code=500 ‘$17==domain && $19 ~ request&& $21 ==code {t++} END{print t}‘ access.log
0
測試語句:
[[email protected] scripts]# awk -F: ‘$1=="root" && $3==0 {print $0}‘ /etc/passwdroot:x:0:0:root:/root:/bin/bash
注意:
判斷匹配的方法:
1)$n~Regex
2)if($n~正則表示式) print $
如果你的awk中使用了 BEGIN語句,就一定要使用 if 不能使用模式比對,否則報錯
如:
報錯:
[[email protected] scripts]# awk -F: ‘$1=="root" && $3==0 BEGIN{n=0} {n++} END{print n}‘ /etc/passwd
awk: $1=="root" && $3==0 BEGIN{n=0} {t++} END{print t}
awk: ^ syntax error
改為:
[[email protected] scripts]# awk -F: ‘BEGIN{n=0} {if($1 =="root" && $3==0)n++} END{print n}‘ /etc/passwd1
應用3: awk中的數組
3 指定網域名稱的
[[email protected] f5-log]$ awk ‘$17 =="gold.dianpingfang.com" {++domain[$21]} END {for(kin domain) print k,domain[k]}‘ access.log
2
200 4498
301 2
500 15
302 321
304 2
本文出自 “崔德華營運打工從業路” 部落格,請務必保留此出處http://cuidehua.blog.51cto.com/5449828/1771599
awk的使用---業務需求