日志统计中awk常见的运用
前言:首先awk是一门语言,其次跟其他语言相比,awk的优势是在文本处理、数值计算等方面,在我们日常的运维工作中,awk还有1个很重要的场景是配合sed、grep的使用,正是因为这些,awk是运维工程师最常用的工具之一,下面记录一下,awk在日志收集、统计场景的一些最常用的姿势。
awk使用格式
awk [-F value] [-v var=value] 'program text' [files....]
program text:
BEGIN {actions}/pattern/{actions}END{actions}
内置变量
FS--Field Separator:域的分隔符,默认的是以空白符分隔
RS--Record Separator 记录的分隔符,默认是以换行符来分隔
FILENAME -- current filename
NF -- Number of Feilds in current record,域的个数
NR -- Number of Record 输入的记录数,相当于行号一样,多个文件时会接着递增
FNR -- File Number of Record 输入的当前记录数,每个文件单独计算
$0 -- the whole record 当前整个记录
$n -- the nth field of the current record 当前记录的第n个域
awk常用函数
1、split (string, array, field separator)
2、substr(s,p,n) 返回字符串s中从p开始长度为n的后缀部分
3、 length函数返回没有参数的字符串的长度
4、gsub(regular expression, subsitutionstring, target string)
awk扩展使用
awk[options] 'script' FILES
选项
-F:字段分隔符
-v:声明一个变量,FS=:
awk'{print $1 $2}' a.txt:则显示welcometo
awk'{print $1,$2}' a.txt:则显示wlecometo
--------------
内置变量
ORS
OFS
FS
RS
NR
NF
FNR
ARGV:数组,保存命令行本身这个字符串,如awk'{print $0}' a.txt b.txt
这个命令中,ARGV[0]保存awk,ARGV[1]保存a.txt
ARGC:awk命令的参数个数
----------------
printf命令的使用格式
printfformat,item1
要点:
1、其与print命令最大的不同是,printf需要指定format
2、format用于指定后面的每个item的输出格式
3、printf语句不会自动打印换行符
format格式的指示符:
%c:显示字符的ASCII
%d,%i:十进制的整数
%e,%E:科学计数法显示数值
%f:显示浮点数
%g,%G:以科学计数法的格式或浮点数的格式显示数值
%s:显示字符串
%u:无符号整数
%%:显示%自身
修饰符:
N:显示宽度
-:左对齐
+:显示数值符号
1,统计squid日志中各个状态码所占的百分比
# cat /usr/local/squid/var/logs/access.log | awk 'BEGIN{print "status code","\t""rate"}{count+=1;a[$9]+=1}END{for(i in a) print i,"\t",a[i]/count*100}' | sort -nk2status code rate400 0.00412448416 0.00412448478 0.00412448204 0.00618672401 0.02680910 0.0659916301 0.0763028302 0.787775404 2.19628403 2.66441206 5.02567304 17.7043200 71.4339
2,统计squid日志中访问次数前10的域名
]# cat /usr/local/squid/var/logs/access.log | awk 'BEGIN{print "domain","\t","rate"}{count+=1;a[$2]+=1}END{for(i in a){print i,"\t",a[i]}}' | sort -nk2 | tailbsy.pp.starschinalive.com 125js1.pcfg.cache.wpscdn.cn 131portal.wsds.cn 162vas.fun.tv 173img.funshion.com 238www.duba.com 277plugin.video.51togic.com 280p1.meituan.net 286res.qxz.37wan.com 306d.ifengimg.com 481
3,统计最近5分钟的流量
日志:27.156.95.175 uc.a.yximgs.com "p_w_picpath/webp" [25/Dec/2016:22:17:01 +0800] "GET http://uc.a.yximgs.com/upic/2016/11/27/11/BMjAxNjExMjcxMTIxMTNfODY2MTM1NV8xMzAxODgwMDQ4XzJfMw==_low.webp?tag=1-1482675421-f-0-8a7txqz36n-ce40124930229f39 HTTP/1.1" 200
cat /usr/local/squid/var/logs/access.log | awk '{i=int(substr($4,17,2)/5)*5;h=substr($4,14,2);s[h":"i]+=$10;}END{for(i in s)print i,s[i]*8/1024/1024/300"Mbps"}'21:50 143.537Mbps
4,MISS的域名请求数top10统计
# cat /usr/local/squid/var/logs/access.log | awk '{n+=1;if($0~/MISS/)a[$2]+=1}END{for(i in a){print i,a[i],a[i]/n*100}}' | sort -nrk2 | headwww.duba.com 237 0.868291p1.meituan.net 163 0.597179pas.suning.com 66 0.241803shopping.suning.com 55 0.20150277g4l9.com5.z0.glb.qiniucdn.com 55 0.201502res.qxz.37wan.com 50 0.183184review.suning.com 41 0.150211static.1sapp.com 32 0.117238s1.vas.wpscdn.cn 30 0.10991fs.ios.kugou.com 25 0.0915919