nginx日志分析shell脚本

先基本了解一几条命令

一下脚本都是基于上面日志格式的,如果你的日志格式不同需要调整awk后面的参数。

分析日志中的UserAgent

 代码如下 复制代码
cat access_20130704.log | awk -F """ '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -20

上面的脚本将分析出日志文件中最多的20个UserAgent

分析日志中那些IP访问最多

 代码如下 复制代码
cat access_20130704.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -20

分析日志中那些
Url请求访问次数最多

 代码如下 复制代码

cat access_20130704.log | awk -F """ '{print $(NF-5)}' | sort | uniq -c | sort -nr | head -20

下面我们进入正题了,利用grep的强大体现在N多方面,这里用grep正则表达式来分析nginx日志,为了方便多次使用,写脚本留念。暂时命名为 nla.sh

可以根据自己的需要修改,被grep的东西,来得到自己想要的结果。

 代码如下 复制代码

#!/bin/bash

#################################################
#
#  这是一个 nginx 默认日志分析脚本
#  主要使用grep来工作

#  考虑到很多人喜欢把日志按日期分割并gz
#  加入了简单的gz格式判断
#  日志分析完成后会把文件还原
#  ccshaowei#gmail.com
#  2012/05/13
#  http://shaowei.info/
################################################

#  修改下面一行为日志位置
log_dir='access.log-*'
##########
#  $key为grep的关键字,$word为提示,要求一一对应,数量相同
##########
#http 代码
key[0]='" 200 [0-9]{3}';word[0]='http 200'
key[1]='" 206 [0-9]{3}';word[1]='http 206'
key[2]='" 404 [0-9]{3}';word[2]='http 404'
key[3]='" 503 [0-9]{3}';word[3]='http 503'
##########
#  seo/seo.html" target="_blank">搜索引擎爬虫
key[4]='Googlebot.*google.com/bot.html';word[4]='来自Google爬虫'
key[5]='Baiduspider.*baidu.com/search/spider.html';word[5]='来自百度蜘蛛'
key[6]='bingbot.*bing.com/bingbot.htm';word[6]='来自Bing爬虫'
#Soso 'Sosospider.*soso.com/webspider.htm'
#有道 'YoudaoBot.*youdao.com/help/webmaster/spider/'
#Yahoo中国 'Yahoo! Slurp China'
##########
#  浏览器
key[7]='MSIE';word[7]='MSIE'
key[8]='Gecko/.*Firefox';word[8]='Firefox'
key[9]='AppleWebKit.*like Gecko';word[9]='Webkit'
key[10]='Opera.*Presto';word[10]='Opera'
#360安全 'MSIE.*360SE' 或加ie内核版本 'MSIE 6.0 .*360SE' 'MSIE 7.0 .*360SE' 'MSIE 8.0 .*360SE' 'MSIE 9.0 .*360SE'
#360急速 'AppleWebKit.*QIHU 360EE'
##########
#  操作系统
key[11]='Windows NT 6.1';word[11]='Windows 7'
key[12]='Macintosh; Intel Mac OS X';word[12]='Mac OS X'
key[13]='X11.*Linux';word[13]='Linux with X11'
key[14]='Android;';word[14]='Android'
#Windows系列 win2000'Windows NT 5.0' winxp'Windows NT 5.1' winvasta'Windows NT 6.0' win7'Windows NT 6.1'
#SymbianOS 'SymbianOS'
##########
#  设备
key[15]='iPad.*like Mac OS X';word[15]='iPad'
key[16]='Nokia';word[16]='诺基亚系列'
key[17]='Nokia5800';word[17]='Nokia5800 XpressMusic'
#iPhone 'iPhone.*like Mac OS X'
##########
#  其他
key[18]='GET /.*.mp3 HTTP';word[18]="访问mp3文件"
key[19]='GET /.*.jpg HTTP';word[19]="访问jpg文件"

#  配置结束
##############################################################################

log_num=$(ls ${log_dir} | wc -l)
fileid=0
isgz=0
#gz检查
for file in $(ls ${log_dir})
do
if [ "${file##*.}" = "gz" ]; then
        isgz[$fileid]=1
        gzip -dvf $file
        logfile[$fileid]=$(echo $file | sed 's/.gz$//')
        (( fileid++ ))
else
        isgz[$fileid]=0
        logfile[$fileid]=$file
        (( fileid++ ))
 fi
done
#  检查key和 word 的数量是否一致
if [ ${#word[@]} -ne ${#key[@]} ]
then
 echo "配置有错误,key和word的数量不一致"
else

checkid=0
while [ $checkid -lt $log_num  ]
do
filename=${logfile[$checkid]}
totle=$(cat $filename | wc -l)
echo "日志 ${filename} 共 ${totle} 行,需要处理 ${#key[@]} 项"
echo "来源IP数:$(cat $filename | awk '{print $1}' |sort|uniq|wc -l)"
i=0
while [ $i -lt ${#key[@]} ]
do
 s1=${word[$i]}
 s2=$(cat $filename | grep ''"${key[$i]}"'' | wc -l)
 s3=$(awk 'BEGIN{printf "%.2f%n",('$s2'/'$totle')*100}')
 echo "${s3} ${s1}: ${s2}"
 ((i++))
done
(( checkid++ ))
echo "-----------------"
done
fi
#  还原压缩文件
gzid=0
while [ $gzid -lt $log_num ]
do
if [ "${isgz[$gzid]}" = "1" ]
then
gzip -v ${logfile[$gzid]}
fi
(( gzid++ ))
done

运行结果范例如下:

[root@hostname temp]# ls -lh
总用量 299M
-rw-r----- 1 root root  11M  5月 14 13:25 access.log-20120508.gz
-rw-r----- 1 root root 158M  5月 14 13:25 access.log-20120509
-rw-r----- 1 root root 2.2M  5月 14 13:25 access.log-20120510.gz
-rw-r----- 1 root root 129M  5月 14 13:25 access.log-20120511
-rwxr-xr-x 1 root root 3.4K  5月 14 13:10 nla.sh
[root@hostname temp]# sh nla.sh
access.log-20120508.gz:     93.5% -- replaced with access.log-20120508
access.log-20120510.gz:     93.9% -- replaced with access.log-20120510
日志 access.log-20120508 共 643281 行,需要处理 20 项
来源IP数:7483
44.52%    http 200: 286400
3.55%    http 206: 22824
20.23%    http 404: 130128
14.31%    http 503: 92029
1.94%    来自Google爬虫: 12491
2.01%    来自百度蜘蛛: 12943
0.90%    来自Bing爬虫: 5780
76.53%    MSIE: 492291
2.21%    Firefox: 14209
7.03%    Webkit: 45215
0.27%    Opera: 1736
25.17%    Windows 7: 161935
1.37%    Mac OS X: 8830
0.03%    Linux with X11: 202
0.03%    Android: 190
0.11%    iPad: 677
0.50%    诺基亚系列: 3207
0.02%    Nokia5800 XpressMusic: 102
36.06%    访问mp3文件: 231959
23.10%    访问jpg文件: 148600
-----------------
日志 access.log-20120509 共 608316 行,需要处理 20 项
来源IP数:7429
45.15%    http 200: 274651
1.79%    http 206: 10884
15.59%    http 404: 94854
19.95%    http 503: 121376
2.83%    来自Google爬虫: 17245
1.80%    来自百度蜘蛛: 10970
0.23%    来自Bing爬虫: 1410
78.96%    MSIE: 480324
1.28%    Firefox: 7783
7.85%    Webkit: 47774
0.43%    Opera: 2597
22.85%    Windows 7: 139022
0.63%    Mac OS X: 3827
0.06%    Linux with X11: 389
0.06%    Android: 372
0.06%    iPad: 351
0.19%    诺基亚系列: 1158
0.00%    Nokia5800 XpressMusic: 4
34.94%    访问mp3文件: 212555
23.46%    访问jpg文件: 142702
-----------------
日志 access.log-20120510 共 141224 行,需要处理 20 项
来源IP数:2040
50.15%    http 200: 70823
1.67%    http 206: 2354
14.15%    http 404: 19987
17.37%    http 503: 24534
4.53%    来自Google爬虫: 6399
2.66%    来自百度蜘蛛: 3754
0.44%    来自Bing爬虫: 622
69.34%    MSIE: 97921
1.19%    Firefox: 1682
9.54%    Webkit: 13470
0.53%    Opera: 742
19.37%    Windows 7: 27351
1.23%    Mac OS X: 1737
0.03%    Linux with X11: 45
0.00%    Android: 0
0.09%    iPad: 130
0.86%    诺基亚系列: 1220
0.00%    Nokia5800 XpressMusic: 0
30.29%    访问mp3文件: 42777
23.91%    访问jpg文件: 33768
-----------------
日志 access.log-20120511 共 473259 行,需要处理 20 项
来源IP数:5093
44.91%    http 200: 212551
1.96%    http 206: 9286
15.14%    http 404: 71671
21.20%    http 503: 100322
2.44%    来自Google爬虫: 11548
1.40%    来自百度蜘蛛: 6616
3.40%    来自Bing爬虫: 16068
76.75%    MSIE: 363224
0.93%    Firefox: 4388
6.75%    Webkit: 31937
0.31%    Opera: 1444
28.62%    Windows 7: 135444
0.43%    Mac OS X: 2057
0.02%    Linux with X11: 116
0.00%    Android: 0
0.09%    iPad: 419
0.23%    诺基亚系列: 1094
0.00%    Nokia5800 XpressMusic: 0
35.77%    访问mp3文件: 169274
22.46%    访问jpg文件: 106299
-----------------
access.log-20120508:     93.5% -- replaced with access.log-20120508.gz
access.log-20120510:     93.9% -- replaced with access.log-20120510.gz
[root@hostname temp]# ls -lh
总用量 299M
-rw-r----- 1 root root  11M  5月 14 13:25 access.log-20120508.gz
-rw-r----- 1 root root 158M  5月 14 13:25 access.log-20120509
-rw-r----- 1 root root 2.2M  5月 14 13:25 access.log-20120510.gz
-rw-r----- 1 root root 129M  5月 14 13:25 access.log-20120511
-rwxr-xr-x 1 root root 3.4K  5月 14 13:10 nla.sh

时间: 2024-09-20 16:44:56

nginx日志分析shell脚本的相关文章

linux中nginx日志分析shell脚本

以前使用虚拟主机的时候,查看网站运行日志,就发现了很多异常的恶意的访问.当时因为自己并没有系统权限没办法对这些行为进行屏蔽.现在有了自己的云主机,前端时间查看日志,又发现了很多恶意访问.正好可以通过最近对shell的学习,来做一个简单的日志分析工具,来屏蔽一些这样的操作. 首先,所谓的分析工具,肯定是建立在人为的分析的基础上的.我们来看一点我的域名运行日志:  代码如下 复制代码 78.56.78.115 - - [21/May/2014:16:54:27 +0800] "POST /wp-lo

nginx日志切割shell脚本_linux shell

一.脚本思路 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志.在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件. 第二步向nginx主进程发送USR1信号. nginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者. 重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件.

简单的nginx日志分割shell脚本

nginx的日志access.log没有分割,访问的记录一直都记录在此文件中,长期下去对于日志查询和文件系统都不好,所以需要进行分割. vim /data/scripts/cut_nginx_log.sh   #!/bin/bash # auto-run this script at 00:00 LOGS_PATH=/data/app/nginx/logs YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) mv ${LOGS_PATH}/access

nginx中使用shell脚本每天定时切割日志

Nginx不支持像Apache 一样使用cronolog来轮转日志,但是可以采用以下方式来实现日志文件的切割: mv /data1/logs/access.log /data1/logs/20111030.log kill -USR1 Nginx主进程号 通过mv命令将日志文件重命名为/data1/logs/20111030.log,然后发送kill -USR1信号给Nginx的主进程号,让Nginx 重新生成一个新的日志文件/data1/logs/access.log. 如果想每天定时切割日志

GoAccess:nginx日志分析利器

面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记忆能力以外,唯一的作用只有装A或者装C了. 对于nginx日志分析,有很多工具,衡量好坏的标准大概就是三快:安装快,解析快,上手快.满足这三点的goaccess确实是居家必备良药. 话说这个标题其实有点委屈GoAccess了,它是一个日志分析工具,并不只是为nginx使用的.你也可以用它来分析apa

nginx日志分析利器GoAccess

面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记忆能力以外,唯一的作用只有装A或者装C了. 对于nginx日志分析,有很多工具,衡量好坏的标准大概就是三快:安装快,解析快,上手快.满足这三点的goaccess确实是居家必备良药. 话说这个标题其实有点委屈GoAccess了,它是一个日志分析工具,并不只是为nginx使用的.你也可以用它来分析apa

php管理nginx虚拟主机shell脚本实例_php技巧

本文实例讲述了php管理nginx虚拟主机shell脚本,分享给大家供大家参考.具体分析如下: 使用php作为shell脚本是一件很方便的事情.理所当然,我们可以使用php脚本来管理 nginx虚拟主机,下面是笔者的 脚本 文件供各位参考: 复制代码 代码如下: #!/usr/bin/php -q <?php   start: fwrite(STDOUT,"===========Vhost Script===========\n"); fwrite(STDOUT,"=

linux中nginx日志分析利器GoAccess使用方法

面试的时候一定会被面到的问题是:给出web服务器的访问日志,请写一个脚本来统计访问前10的IP有哪些?访问前10的请求有哪些?当你领略过goaccess之后,你就明白,这些问题,除了考验你的脚本背诵记忆能力以外,唯一的作用只有装A或者装C了. 对于nginx日志分析,有很多工具,衡量好坏的标准大概就是三快:安装快,解析快,上手快.满足这三点的goaccess确实是居家必备良药. 话说这个标题其实有点委屈GoAccess了,它是一个日志分析工具,并不只是为nginx使用的.你也可以用它来分析apa

[喵咪Liunx(6)]Nginx日志分析工具goaccess

[喵咪Liunx(6)]Nginx日志分析工具goaccess w-blog博客 前言 哈喽大家好呀!真是好久不见了,说来有些惭愧,离上一次发布博客已经是2016年的事情了,在这段时间中工作也比较忙,需要学习的东西也比较多,趁着过年前后有一些时间可以来好好分享分享一些有意思的东西,今天给大家带来的是Nginx日志分析工具goaccess,goaccess可以对Nginx的LOG文件进行分析,对请求量,用户数量等进行可视化展示,好那么久进入我们今天的正题吧! 附上: 喵了个咪的博客:w-blog.