有一个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