用awk工具分析系统日志-小试牛刀
最近团队需要分析一下网站各uri在框架中的执行时间,所以想到用awk这个分析字符串能力很强的工具来时间,下面是实现代码,具体看行注释。
下面这个是awk 脚本,然后运行 cat 框架日志文件|awk -f hapn.awk|sort -k2nr,结果就行了.
#!/bin/awk #desc 统计系统日志发掘请求执行记录 #author ********* #date 2013.4.24 BEGIN {
#初始化统计记录个数变量 total_count=0; } /uri:\/[a-z]+/&&/total/ {#匹配日志记录中符合这个规则的记录uri:/accounts/login total:78643 gsub(/\[/," ",$0);#替换单行记录中的[ gsub(/\]/," ",$0);#替换单行记录中的] gsub(/\=/,":",$0);#替换单行记录中的= gsub(/time\:/,"",$0);#替换单行记录中的time: uri=""; total=0; total_count++; for(i=1;i<=NF;i++) { #匹配uri m=match($i,/uri/);#正则匹配uri的字段 if(m>0) { split($i,ar,":");#将uri:/acctounts 分拆为ar[1]="uri" ar[2]="/accounts"的数组 uri_str=ar[2]; uri=""; len=split(uri_str,u_ar,"/");#分拆ar[2]以/为分割符 for(j=1;j<=len;j++) { if(u_ar[j]) { if(0<match(u_ar[j],/^[0-9]+$/))#匹配数字 如果uri中有数字则统计为一类uri { uri=uri"/[NUM]";#带有数字的uri的替换数字为NUM }else{ uri=uri"/"u_ar[j]; } } } continue; } #匹配耗时 m=match($i,/total/);#正则匹配total的字段 if(m>0) { split($i,ar,":"); total=ar[2]; } } #存储相关值 if(uri in source)#看看数组是否已经记录uri { source[uri]+=total; source_count[uri"_count"]+=1; #计算最大值 if(source_max[uri]<total) { source_max[uri]=total; } #计算最小值 if(source_min[uri]>total) { source_min[uri]=total; } }else{#为数组赋初值 source[uri]=total; source_count[uri"_count"]=1; source_max[uri]=total; source_min[uri]=total; } } END {#最后计算统计结果并输出 for(m in source) { #计算平均耗时 average = source[m]/source_count[m"_count"]/1000; if(average>100) { #计算uri的请求比率 average_rows = source_count[m"_count"]/total_count*100; printf("%-30s\t%-20.2f\t%-20.2f\t%-20.2f\t%-20.2f\t%-20d\t%-20d\n",m,average,source_max[m]/1000,source_min[m]/1000,average_rows,source_count[m"_count"],total_count); } } }