统计web日志中IP访问次数

有一个大于10G的apache访问日志,要求找出访问/stat.php页面次数大于1000次的前100个IP
日志样本如下:

212.11.129.182 - [26/Mar/2015:03:00:01 +0800] "GET/stat.php?pid=016 HTTP/1.1" 302 20-"-" "-" ""Mozllia/4.0(compatible;MSIE 6.0;Windows NT 5.1)"

解析:10G的日志已经很大了,直接使用grep或者awk进行分析会很慢,对服务器内存消耗大,如果服务器配置低,可以考虑把日志切割,比如切割成100个100M的文件,然后针对这100个文件分别进行统计排名前100的IP,得出结果后合并到一个文件中,再进一步分析。
答案:

#!/bin/bashsta(){    grep '/stat.php' $1|awk '{print $1}' | sort -n |unic -n|sort -n|tail -100}logfile=/data/logs/access.logmkdir /data/logs/tmpcd /data/logs# 分割成100个100M的文件split -b 100M access.log smallfilemv smallfile* tmpcd tmp# 把分割后的文件中的ip前100个计算出来for f in `ls smallfile*`do    sta $f >> top100.txtdone# 编写函数,计算每个IP出现的次数count_sum(){    sum=0    for f in `ls smallfile*`    do        n=`grep "$1" $f|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.txtdone# 先把IP大于1000次的过滤出来,然后按照IP次数进行排序,得到前100个awk '$1>1000' ip.txt|sort -nr|head -100

find命令

题:写一个脚本或者一条命令查找/var/log目录下,最后修改时间大于30天,后缀为*.log的文件并删除。
答:

find /var/log/ -mtime +30 -name "*.log" -exec rm -rf {}\;

题:写一个脚本或者一条命令将/data目录下大于100K的文件移动到/tmp目录下
答:

find /data -size +100k -exec mv {} /tmp \;

iptables

题:如何将192.168.10.2主机80端口的请求转发到172.116.10.3的8080端口?
答:

iptables -t nat -A PREROUTING -d 192.168.10.2 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.116.10.3:8080

题:只允许远程主机访问本地80端口,写出iptables规则?
答:

iptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -P INPUT DROP