shell日志分析脚本

  1 #!/bin/bash
  2 ###########################################
  3 #
  4 #      version:    3.0.0
  5 #         creator:    zenghui       
  6 #         datetime:   05/06/2015
  7 #
  8 ###########################################
  9 #判断命令行参数
 10 if [ "$1" = "-f" ] && [ "$2" != "" ]
 11 then
 12 access_log="$2"
 13 
 14 #定义输入时间
 15 function feng() {
 16     read -p "请输入开始时间(10:30:00)秒数不输入默认为00: " a
 17     read -p "请输入结束时间(10:35:00)秒数不输入默认为00: " b
 18     if [[ "$a" =~ ^[0-9]{2}:[0-9]{2}:[0-9]{2}$ ]]
 19     then
 20         time_qing=`date +'['%d/%b/%Y:`$a
 21     else
 22         time_qing=`date +'['%d/%b/%Y:`$a":00"
 23     fi
 24 
 25     if [[ "$b" =~ ^[0-9]{2}:[0-9]{2}:[0-9]{2}$ ]]
 26     then    
 27         time_hou=`date +'['%d/%b/%Y:`$b
 28     else
 29         time_hou=`date +'['%d/%b/%Y:`$b":00"
 30     fi
 31     awk_value=`awk -v a=$time_qing -v b=$time_hou 'BEGIN{if (a>b) print "yes"}'`
 32 }
 33 
 34 #定义主菜单
 35 function menu() {
 36     clear
 37     echo -e "****************33[34;7m 日志统计33[0m*********************"
 38     echo "*            1、全站统计                    *"
 39     echo "*            2、以时间统计                  *"
 40     echo "*            3、exit                        *"
 41     echo "*********************************************"    
 42 }
 43 
 44 
 45 #定义全站统计共享函数
 46 function cmdquanz() {
 47         echo "$total"
 48         read -p "请输入编号显示ip的url记录: " totip
 49         tot=`echo "$total" | awk -v totip="$totip" '{if ($1 == totip) print $3}'`
 50     tempfile=`mktemp`
 51         temp1=`mktemp`
 52         temp2=`mktemp`
 53         echo $tempfile' '$temp1' '$temp2
 54         cat "$access_log" | awk -v tot=$tot '{if ($1 == tot) print $0}'> $tempfile
 55         awk '{print "33[31m "$7" 33[0m""33[32m "$10/1024/1024"MB 33[0m"}' $tempfile > $temp1
 56         awk -F'"' '{print "33[34m "$6" 33[0m"}' $tempfile > $temp2
 57         paste $temp1 $temp2 | sort | uniq -c | sort -nr |more
 58         #echo $tot
 59         #cat "$access_log" | awk -v tot=$tot '{if ($1 == tot) print $7}' | sort | uniq -c | sort -nr |more
 60         read -p "q退出上一级,Enter 继续" i
 61         if [ "$i" = "q" ];then
 62                 quanz
 63         else
 64                 clear
 65                 cmdquanz
 66         fi
 67 }
 68 
 69 #iptables函数
 70 function Iptables() {
 71     echo -e "*******************33[34;7m 功能选择33[0m******************"
 72     echo "*            1、显示ip的url、agent          *"
 73     echo "*            2、将ip加入iptables            *"
 74     echo "*            3、将ip加入nginx黑名单         *"
 75     echo "*            4、exit                        *"
 76     echo "*********************************************"
 77     read -p "请输入您要选择的编号: " Ipt
 78 }
 79 
 80 function Ima() {
 81     echo -e "*****************33[34;7m 功能选择33[0m****************************"
 82     echo  "*            1、单个ip加入nginx黑名单                *"
 83     echo  "*            2、全加入nginx黑名单                    *"
 84     echo  "*            3、回上一级                             *"
 85     echo  "*            4、exit                                 *"
 86     echo  "******************************************************"
 87     read -p "请输入您要选择的编号: " imge
 88 }
 89 
 90 #定义访问都是静态文件函数
 91 function Images() {
 92     read -p "输入你要查询的关键字(jpg,js,html):" gjz
 93         feng
 94         jpg_ip=`cat /var/log/nginx/access_www.log |awk -v a=$time_qing -v b=$time_hou '{if ($4>a && $4<b) print $0}' | awk -v gjz=$gjz '{m[$1]=m[$1]+$10}{ipp[$1]=ipp[$1]+1}{if ($7 ~ gjz){a=1;ip[$1]=ip[$1]+a}}END{for(i in ip) if (ipp[i]==ip[i] && m[i]>1000000) print i,m[i]/1024/1024"MB"}' | sort -k 2 -nr | head -20 | cat -n`
 95     echo "$jpg_ip"
 96     Ima
 97     case $imge in
 98     1)
 99     read -p "再输入之前的ip编号(加入黑名单):" imge_ip
100     tot=`echo "$jpg_ip" | awk -v im="$imge_ip" '{if ($1 == im) print $2}'`
101     nginx_black
102         read -p "Enter 继续"
103         shij;;
104     2)
105     read -p "确定请按Y/y:" ye
106     if [ "$ye" = "Y" ] || [ "$ye" = "y" ];then
107     shibai=`cat /usr/local/lnmp/nginx/conf/black.list`
108     chg=`echo "$jpg_ip" | awk '{print "deny "$2";"}' && cat /usr/local/lnmp/nginx/conf/black.list | sort | uniq | grep -v "58.247.43.226"`
109     echo "$chg" >  /usr/local/lnmp/nginx/conf/black.list
110          if [ "`/usr/local/lnmp/nginx/sbin/nginx -t > /dev/null 2>&1 && echo $?`" == "0" ];then
111                     /usr/local/lnmp/nginx/sbin/nginx -s reload  > /dev/null 2>&1
112                     echo "nginx 配置文件重新加载成功"
113                 else
114                     echo "nginx 配置文件重新加载失败"
115             echo "$shibai" > /usr/local/lnmp/nginx/conf/black.list
116         fi
117         fi
118     read -p "Enter 继续"
119     shij;;
120     3)
121     shij;;
122     *)
123     exit;;
124     esac
125 }
126 
127 #定义nginx黑名单
128 function nginx_black() {
129     nginx_black=/usr/local/lnmp/nginx/conf/black.list
130     if [ "$tot" != "" ];then
131         cat /usr/local/lnmp/nginx/conf/black.list | grep "$tot" || echo "deny $tot;">>$nginx_black
132        echo "$tot 已加入nginx黑名单"
133     if [ "`/usr/local/lnmp/nginx/sbin/nginx -t > /dev/null 2>&1 && echo $?`" == "0" ];then
134         /usr/local/lnmp/nginx/sbin/nginx -s reload  > /dev/null 2>&1
135         echo "nginx 配置文件重新加载成功"
136     else
137         echo "nginx 配置文件重新加载失败"
138     fi
139     fi
140 }
141 
142 #定义以时间统计共享函数
143 function cmdshij() {
144         echo "$total"
145         read -p "请输入编号: " totip
146         tot=`echo "$total" | awk -v totip="$totip" '{if ($1 == totip) print $3}'`   #获取ip
147     Iptables
148     
149     #对ip进行整理输出
150     case $Ipt in
151     1)
152         echo $tot' ptr'`dig -x $tot +short`
153     tempfile=`mktemp`
154     temp1=`mktemp`
155     temp2=`mktemp`
156     echo $tempfile' '$temp1' '$temp2
157     awk -v a=$time_qing -v b=$time_hou '{if ($4>a && $4<b) print $0}' "$access_log" | awk -v tot=$tot '{if ($1 == tot) print $0}'> $tempfile
158     awk '{print "33[31m "$7" 33[0m""33[32m "$10/1024/1024"MB 33[0m"}' $tempfile > $temp1
159     awk -F'"' '{print "33[34m "$6" 33[0m"}' $tempfile > $temp2
160     paste $temp1 $temp2 | sort | uniq -c | sort -nr |more
161     read -p "q退出上一级,Enter继续" i
162     if [ "$i" = "q" ];then
163         shij
164     else
165         clear
166         cmdshij
167     fi;;
168     2)
169     if [ "$tot" != "" ];then
170         iptables -L -n | grep "$tot" >/dev/null || iptables -I INPUT -s $tot -j DROP
171         echo "$tot 已加入iptables"
172     fi
173     read -p "q退出上一级,Enter继续" i
174         if [ "$i" = "q" ];then
175                 shij
176         else
177         clear
178                 cmdshij
179         fi;;
180     3)
181     nginx_black
182         read -p "q退出上一级,Enter继续" i
183         if [ "$i" = "q" ];then
184                 shij
185         else
186                 clear
187                 cmdshij
188         fi;;
189     *)
190     exit;;
191     esac
192 
193 }
194 
195 #定义全站统计函数
196 function quanz() {
197     clear
198     echo -e "****************33[34;7m全站统计33[0m*********************"
199     echo "*            1、以流量排序                  *"
200     echo "*            2、以ip个数排序                *"
201     echo "*            3、回上一级                    *"
202     echo "*            5、退出                        *"
203     echo "*********************************************"
204 read -p "请输入编号: " qz
205 case $qz in 
206     1)
207     total=`awk '{a[$1]=a[$1]+$10;++b[$1]}END{for(i in a)print a[i]/1024/1024"MB",i,b[i]}' "$access_log" | sort -nr | head -20| cat -n`
208     cmdquanz
209     quanz;;
210     2)
211     total=`awk '{a[$1]=a[$1]+$10;++b[$1]}END{for(i in a)print a[i]/1024/1024"MB",i,b[i]}' "$access_log" | sort -k 3 -nr | head -20| cat -n`
212     cmdquanz
213     quanz;;
214     3)
215     menu;;
216     *)
217     exit;;
218 esac
219 }
220 
221 #定义以时间统计函数
222 function shij() {
223     clear
224     echo -e "****************33[34;7m以时间统计33[0m*******************"
225     echo "*            1、以流量排序                  *"
226     echo "*            2、以ip个数排序                *"
227     echo "*            3、时间段ip总数                *"
228     echo "*            4、时间段全访问jpg or html     *"
229     echo "*            5、回上一级                    *"
230     echo "*            6、退出                        *"
231     echo "*********************************************"
232 read -p "请输入编号: " sj
233 case $sj in
234     1)
235     feng
236     if [ ${awk_value:-no} = "yes" ] || [ "$a" = "" ] || [ "$b" = "" ]
237     then
238         clear
239         echo "输入有误,请重新输入"
240         shij
241     else
242         total=`awk -v a=$time_qing -v b=$time_hou '{if ($4>a && $4<b) print $0}'  "$access_log"| awk '{a[$1]=a[$1]+$10;++b[$1]}END{for(i in a)print a[i]/1024/1024"MB",i,b[i]}' | sort -nr | head -20 | grep -v "e-" | cat -n`
243         cmdshij
244         shij
245     fi;;
246     2)
247         feng
248         if [ ${awk_value:-no} = "yes" ] || [ "$a" = "" ] || [ "$b" = "" ]
249         then
250         clear
251             echo "输入有误,请重新输入"
252             shij
253         else
254             total=`awk -v a=$time_qing -v b=$time_hou '{if ($4>a && $4<b) print $0}'  "$access_log"| awk '{a[$1]=a[$1]+$10;++b[$1]}END{for(i in a)print a[i]/1024/1024"MB",i,b[i]}' | sort -k 3 -nr | head -20| cat -n`
255         cmdshij
256             shij
257         fi;;
258     3)
259     feng
260     echo "ip总数: ""`awk -v a=$time_qing -v b=$time_hou '{if ($4>a && $4<b) print $0}'  "$access_log"| awk '{print $1}' | sort | uniq -c | wc -l`"
261     awk -v a=$time_qing -v b=$time_hou '{if ($4>a && $4<b) print $0}'  "$access_log"| awk '{print $1}' | sort | uniq -c | sort -nr |more 
262         read -p "Enter 继续"
263     shij;;
264     4)
265     Images;;
266     5)
267     menu;;
268     *)
269     exit;;
270 esac
271 }
272 
273 #循环显示
274 while true
275 do
276 menu
277 read -p "请输入编号: " bh
278 case $bh in
279     1)
280     quanz;;
281     2)
282     shij;;
283     *)
284     exit;;
285 esac
286 done
287 #初始化变量aa
288 elif [ "${aa:--h}" = "-h" ]
289 then
290     echo "运行: ./datalog_ip_sort.sh -f 日志文件"
291 fi
原文地址:https://www.cnblogs.com/zenghui940/p/4431878.html