共计 1321 个字符,预计需要花费 4 分钟才能阅读完成。
统计 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/bash
sta(){grep '/stat.php' $1|awk '{print $1}' | sort -n |unic -n|sort -n|tail -100
}
logfile=/data/logs/access.log
mkdir /data/logs/tmp
cd /data/logs
# 分割成 100 个 100M 的文件
split -b 100M access.log smallfile
mv smallfile* tmp
cd tmp
# 把分割后的文件中的 ip 前 100 个计算出来
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|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 大于 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 ACCEPT
iptables -P INPUT DROP
正文完