假設apache日志格式為:
118.78.199.98 – - [09/Jan/2010:00:59:59 +0800] “GET /Public/Css/index.css HTTP/1.1″ 304 – “http://www.a.cn/common/index.php”“Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6.3)”
問題1:在apachelog中找出訪問次數最多的10個IP。
awk '{print $1}' apache_log |sort |uniq -c|sort -nr|head -n 10
awk 首先將每條日志中的IP抓出來,如日志格式被自定義過,可以 -F 定義分隔符和 print指定列;
sort進行初次排序,為的使相同的記錄排列到一起;
upiq -c 合并重復的行,并記錄重復次數。
head進行前十名篩選;
sort -nr按照數字進行倒敘排序。
我參考的命令是:
顯示10條最常用的命令
代碼如下:sed -e "s/| /n/g" ~/.bash_history | cut -d ' ' -f 1 | sort | uniq -c | sort -nr | head
問題2:在apache日志中找出訪問次數最多的幾個分鐘。
代碼如下:awk '{print $4}' access_log |cut -c 14-18|sort|uniq -c|sort -nr|head
awk 用空格分出來的第四列是[09/Jan/2010:00:59:59;
cut -c 提取14到18個字符 -- 00:59
剩下的內容和問題1類似。
問題3:在apache日志中找到訪問最多的頁面:
代碼如下:awk '{print $11}' apache_log |sed 's/^.*cn(.*)"/1/g'|sort |uniq -c|sort -rn|head
類似問題1和2,唯一特殊是用sed的替換功能將”http://www.a.cn/common/index.php”替換成括號內的內容:”http://www.a.cn(/common/index.php)”
問題4:在apache日志中找出訪問次數最多(負載最重)的幾個時間段(以分鐘為單位),然后在看看這些時間哪幾個IP訪問的最多?
1,查看apache進程:
代碼如下:ps aux | grep httpd | grep -v grep | wc -l // ps aux是顯示所有進程和其狀態。
2,查看80端口的tcp連接:
代碼如下:netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l
3,通過日志查看當天ip連接數,過濾重復:
代碼如下:cat access_log | grep "19/May/2011" | awk '{print $2}' | sort | uniq -c | sort -nr
4,當天ip連接數最高的ip都在干些什么(原來是蜘蛛):
代碼如下:cat access_log | grep "19/May/2011:00" | grep "61.135.166.230" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
5,當天訪問頁面排前10的url:
代碼如下:cat access_log | grep "19/May/2010:00" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10
6,用tcpdump嗅探80端口的訪問看看誰最高
代碼如下:tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr
接著從日志里查看該ip在干嘛:
代碼如下:cat access_log | grep 220.181.38.183| awk '{print $1"t"$8}' | sort | uniq -c | sort -nr | less
7,查看某一時間段的ip連接數:
代碼如下:grep "2006:0[7-8]" www20110519.log | awk '{print $2}' | sort | uniq -c| sort -nr | wc -l
新聞熱點
疑難解答