资讯专栏INFORMATION COLUMN

awk分析日志得到响应时间的最大最小和平均值

lindroid / 3324人阅读

摘要:将文件遍历一次,最大最小和平均都可以计算出来的,再不济,最大值和最小值其实在排序之后就出来了,可以这样用输出两条记录仔细研究了下,最后的代码是这样的要查询的中有斜杠,斜杠前要加转义,这一步在中进行

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

从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/bash

function 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/bash

function 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中进行

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/9062.html

相关文章

  • awk分析日志得到响应时间最大最小均值

    摘要:将文件遍历一次,最大最小和平均都可以计算出来的,再不济,最大值和最小值其实在排序之后就出来了,可以这样用输出两条记录仔细研究了下,最后的代码是这样的要查询的中有斜杠,斜杠前要加转义,这一步在中进行 今天有个分析日志的需求,要获得指定的几个请求的响应时间的最大值,最小值和平均值 从nginx配置中找到日志的格式如下: log_format _main $remote_addr $ti...

    fou7 评论0 收藏0
  • SegmentFault 技术周刊 Vol.19 - Linux 文本处理三利器

    摘要:所以,本期周刊将介绍命令行世界中最常用的文本处理命令三巨头,让它们带你初步领略命令行的强大。简单的,可以直接理解为是一个数据处理工具,倾向于将一行文本分成数个字段来处理,适合小型数据的处理。 showImg(https://sfault-image.b0.upaiyun.com/226/799/2267992322-586b7c52ed9fc); 之前看过一篇文章《当我们 chmod ...

    hightopo 评论0 收藏0
  • 微服务治理之如何优雅应对突发流量洪峰

    摘要:以上两点同时满足时则说明服务处于高负载状态,则进行自适应降载。如果放行则返回,等待业务侧执行回调函数执行指标统计。当前系统的最大并发数窗口单位时间内的最大通过数量窗口单位时间内的最小响应时间。 为什么需要降载微服务集群中,调用链路错综复杂,作为服务提供者需要有一种保护自己的机制,防止调用方无脑调用压垮自己,保证...

    Jeffrrey 评论0 收藏0
  • 十分钟解决爬虫问题!超轻量级反爬虫方案

    摘要:爬虫和反爬虫日益成为每家公司的标配系统。本文将描述一种尽量简单的反爬虫方案,可以在十几分钟内解决部分简单的爬虫问题,缓解恶意攻击或者是系统超负荷运行的状况至于复杂的爬虫以及更精准的防御,需要另外讨论。 showImg(https://segmentfault.com/img/bVDYV4?w=800&h=568); 爬虫和反爬虫日益成为每家公司的标配系统。爬虫在情报获取、虚假流量、动态...

    LeanCloud 评论0 收藏0
  • 十分钟解决爬虫问题!超轻量级反爬虫方案

    摘要:爬虫和反爬虫日益成为每家公司的标配系统。本文将描述一种尽量简单的反爬虫方案,可以在十几分钟内解决部分简单的爬虫问题,缓解恶意攻击或者是系统超负荷运行的状况至于复杂的爬虫以及更精准的防御,需要另外讨论。 showImg(https://segmentfault.com/img/bVDYV4?w=800&h=568); 爬虫和反爬虫日益成为每家公司的标配系统。爬虫在情报获取、虚假流量、动态...

    Jeff 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<