上级来了一个需求,统计日志某一天内的日志业务日志访问量,按小时统计。
上去服务器一看,今天的日志达到了8G,有点恐怖,先开始分析吧
less access.log
查看日志的一些格式
[00:00:00.000] [<id=1111>] acc346346ess?u545345r&password
[00:00:00.023] [<id=1111>] access?user&pa346346word
[00:00:00.045] [<id=1111>] ac436346ess?us346346er&password
[00:00:03.000] [<id=2222>] ac634636cess?us6346346er&password
[00:00:03.003] [<id=2222>] ac346346cess?use63463463r&password
[00:00:03.005] [<id=2222>] acce46346ss?user&pa3463463463466ssword
........
........
[14:00:03.000] [<id=4545>] ac634636cess?us6346346er&password
[23:50:03.003] [<id=3232>] ac346346cess?use63463463r&password
[23:00:03.005] [<id=5545>] acce46346ss?user&pa3463463463466ssword
通过观察可以发现
日志可以分为三段 [23:00:03.005]
[<id=5545>]
acce46346ss?user&pa3463463463466ssword
可以先对日志进行提取,提取时间和id信息
cat access.log | cut -d ' ' -f 1,2 >1.txt
使用cut把日志利用 空格符号分为三段,把日志信息前面两段 提取出来,输出到1.txt
中
现在1.txt
的文本内容如下
[00:00:00.000] [<id=1111>]
[00:00:00.023] [<id=1111>]
[00:00:00.045] [<id=1111>]
[00:00:03.000] [<id=2222>]
[00:00:03.003] [<id=2222>]
[00:00:03.005] [<id=2222>]
........
........
[14:00:03.000] [<id=4545>]
[23:50:03.003] [<id=3232>]
[23:00:03.005] [<id=5545>]
下面统计总的请求数量,去除重复的id选项
cat 1.txt | awk '{print $2}' |sort|uniq -c| wc -l
awk '{print $2}'
的意思是提取第二列的数据
uniq -c
的意思就是去除重复的id选项 1111 2222 之类的
wc -l
统计总行数
这样就可以统计出总的请求数
总的请求数量统计出来了,如何统计每个小时的请求数量呢
这就需要对日志按照日期进行分割
参考日志小时开头格式 00 01 02 03 之类的
那么利用这个提取出00小时的访问量
cat 1.txt |grep '\['00 |cut -d ' ' -f 2|sort|uniq -c| wc -l
使用grep '\['00
过滤出00时间段的请求,之后在进行提取第二段和去重,之后在统计行数。
就可以统计出具体00一个小时内的请求了。
一天24小时,不可能输入24遍吧,那么就可以用到for循环
创建一个数组,00-23,然后循环这个数组即可
for i in {00..23};do cat 1.txt |grep '\['$i |cut -d ' ' -f 2|sort|uniq -c| wc -l
这样一句话,就实现了循环提取24小时的的日志统计了。
合并一句话的语句
for i in {00..23};do cat access.log | cut -d ' ' -f 1,2|grep '\['$i |cut -d ' ' -f 2|sort|uniq -c| wc -l
后记:
其实,我的sed和awk用的不是很熟练,如果很熟练的话,应该还有更加简单的统计方式。
这个只能等后续熟练了sed和awk在来优化吧,能用就行了