博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
awk分析日志得到响应时间的最大最小和平均值
阅读量:6712 次
发布时间:2019-06-25

本文共 2178 字,大约阅读时间需要 7 分钟。

今天有个分析日志的需求,要获得指定的几个请求的响应时间的最大值,最小值和平均值

从nginx配置中找到日志的格式如下:

log_format _main '$remote_addr "$time_iso8601" $request_method "$uri" "$args" "$request_body" $status $body_bytes_sent $request_time "$http_user_agent"';

倒数第二项$request_time即为响应时间

实际日志截取部分如下,域名换掉了:

10.100.27.171 "2015-08-01T00:00:02+08:00" GET "/interface/ipad_v3/sub_channels" "cid=85&ver=3.9.5" "-" 200 588 0.003 "api.3g.example.com/3.0"

10.100.27.172 "2015-08-01T00:00:02+08:00" GET "/interface/ios_v3/sub_channel_details_with_playlist" "sub_channel_id=227&ver=3.9" "-" 200 2912 0.334 "api.3g.example.com/3.0"
10.100.27.172 "2015-08-01T00:00:02+08:00" GET "/interface/android_v3/sub_channel_details" "sub_channel_id=107&show_game_information=1&ver=4.8" "-" 200 3480 0.129 "api.3g.example.com/3.0"

日志文件名格式大概是log.20150801这样的,我打算把脚本和日志放一个文件夹下

一开始函数是这么写的,需要注意的是,$1既能表示shell函数的第一个参数,又能表示awk中的第一个域,有冲突。所以用'"$1"',用'将前面的句子关闭,然后在""中插入shell的参数$1,再用'开启后面的句子;也可以用awk -v needle="$1"这种赋值替换方式

#! /bin/bashfunction get_min(){        ls | grep 'log.' | xargs cat | awk '$7==200 && $4 ~/^"'"$1"'/{print "Min = ", $9}' | sort -n -k 2  |   head -1}function get_max() {        ls | grep 'log.' | xargs cat | awk '$7==200 && $4 ~/^"'"$1"'/{print "Max = ", $9}' | sort -rn -k 2  |   head -1}function get_avg() {        ls | grep 'log.' | xargs cat | awk '$7==200 && $4 ~/^"'"$1"'/{sum+=$9} END {print "Average = ", sum/NR}'}

最容易想到的,明显不是最优的,代码很冗余。将文件遍历一次,最大最小和平均都可以计算出来的,再不济,最大值和最小值其实在排序之后就出来了,可以这样用sed输出两条记录

awkfunction get_min_and max {    ls | grep 'log.' | xargs cat | awk '$8=200 && $4 ~/^"'"$1"'/{print $9}' | sort -n -k 2  |   sed -n '1p;$p'}

仔细研究了下awk,最后的代码是这样的

awk#! /bin/bashfunction cal_work(){        ls | grep 'log.' | xargs cat | awk   'BEGIN{max=0;min=1}                {if ($4 ~ /^"'"$1"'/  && $(NF-3)==200){                        sum+=$9; count+=1;                        if($9 > max) max=$9 fi;if($9 < min) min=$9 fi;                    }                }                END {print "Average = ", sum/count;print "Max = ", max;print "Min", min}'}function get_stat(){        target=$1        target=${target//\//\\/}        cal_work $target}get_stat '/interface/ipad_v3/sub_channels'

要查询的path中有斜杠,斜杠前要加'\'转义,这一步在get_stat中进行

转载地址:http://hkolo.baihongyu.com/

你可能感兴趣的文章
全面屏手机的高颜值代表:vivo X20真机实拍图曝光
查看>>
OpenCV空洞填充算法
查看>>
“亚健康”网络安全环境是规模性攻击的温床
查看>>
MaxCompute - ODPS重装上阵 第四弹 - CTE,VALUES,SEMIJOIN
查看>>
DirectInput8Create
查看>>
SGI OpenGL Teapot
查看>>
启创卓越智慧园区创新中心落户津宁蓉
查看>>
10月10日云栖精选夜读:阿里云Tech Insight 企业迁云实战专场强势来袭!
查看>>
物联网带动医疗服务升级:六大原则守护网路安全
查看>>
WCF后续之旅(1): WCF是如何通过Binding进行通信的
查看>>
【眼力测试】看图识字
查看>>
设计模式小结
查看>>
快播关闭服务器,你怎么看?
查看>>
免费好用的阿里云云盾证书服务(https证书)申请步骤
查看>>
2017杭州云栖大会100位大咖视频+讲义全分享
查看>>
【云栖大会】持续拥抱开源阿里云计算能力三大突破
查看>>
在linux下制作静态库和动态链接库的方法
查看>>
ZeroMQ试用笔记之REQ & ROUTER
查看>>
PowerDesigner列名、注释内容互换
查看>>
[译] 利用 Immutability(不可变性)编写更为简洁高效的代码
查看>>