分析日志中访问最大的前100IP

有一个10G大的apache访问日志,要求找出访问/stat.php面页次数大于10000次的前100个IP。

日志样本:211.11.129.181 — [26/Mar/2015:03:00:01 +0800] “GET/stat.php?pid=016 HTTP/1.1” 302 “-” “-” “”Mozllia/4.0(compatible;MSIE 6.0;Windows NT 5.1)”

分析:10G日志很大了,直接grep或者awk去分析肯定很慢,对内存消耗也是非常大的。若服务器配置较低,可以考虑把日志切割,比如切割成100个100M的文件,然后再针对这100个文件分别去统计排名前100的ip,得出结果后合并到一个文件中,再进行一次分析。

所以使用shell脚本来:

!/bin/bash

sta() {

grep ‘/stat.php’ $1|awk ‘{print $1}’|sort -n |unic -c|sort -n|tail -100

}

logfile=/data/logs/access.log

mkdir /data/logs/tmp

cd /data/logs

split -b 100M access.log smallfile

mv smallfile* tmp

cd tmp

把分割后的小文件里面的ip top100计算出来

for f in ls smallfile*

do

sta $f >> top100.txt

done

编写函数,计算每个ip出现的次数

count_sum() {

sum=0

for f in ls smallfile*

do

n=grep “$1” $f|awk ‘{print $1}|wc -l

sum=$[$sum+$n]

echo $sum $1

done

}

把得到的全部ip去重,作为遍历对象,把所有ip出现次数全部算出来

for ip in awk ‘{print $2}’ top100.txt|sort -n |uniq

do

count_sum $ip >> ip.txt

done

先把ip大于10000次的过滤出来,然后按ip的次数排序,得到前100个

awk ‘$1>10000’ ip.txt|sort -nr |head -100

上一篇:JAVA9目前不支持eclipse。。。


下一篇:Rsync服务让SLB下多台centos服务器文件同步更新