日志统计中awk常见的运用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了日志统计中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的输出格式
3printf语句不会自动打印换行符
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 -nk2
status code 	rate
400 	 0.00412448
416 	 0.00412448
478 	 0.00412448
204 	 0.00618672
401 	 0.0268091
0 	 0.0659916
301 	 0.0763028
302 	 0.787775
404 	 2.19628
403 	 2.66441
206 	 5.02567
304 	 17.7043
200 	 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 | tail
bsy.pp.starschinalive.com 	 125
js1.pcfg.cache.wpscdn.cn 	 131
portal.wsds.cn 	 162
vas.fun.tv 	 173
img.funshion.com 	 238
www.duba.com 	 277
plugin.video.51togic.com 	 280
p1.meituan.net 	 286
res.qxz.37wan.com 	 306
d.ifengimg.com 	 481

3,统计最近5分钟的流量

日志:27.156.95.175 uc.a.yximgs.com "image/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  | head
www.duba.com 237 0.868291
p1.meituan.net 163 0.597179
pas.suning.com 66 0.241803
shopping.suning.com 55 0.201502
77g4l9.com5.z0.glb.qiniucdn.com 55 0.201502
res.qxz.37wan.com 50 0.183184
review.suning.com 41 0.150211
static.1sapp.com 32 0.117238
s1.vas.wpscdn.cn 30 0.10991
fs.ios.kugou.com 25 0.0915919


本文出自 “杰希” 博客,请务必保留此出处http://jachy.blog.51cto.com/10625380/1886034

以上是关于日志统计中awk常见的运用的主要内容,如果未能解决你的问题,请参考以下文章

日志分析查看——grep,sed,sort,awk运用

比较awk python: [文件]web日志信息统计 。 [命令]netstat命令状态统计

grep, sed, sort, awk运用

Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)

Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)

awk, uniq, sort统计日志信息