常用服務器日誌分析命令大全

常用服務器日誌分析命令大全

1、查看有多少個IP訪問:

 awk '{print $1}' log_file|sort|uniq|wc -l
 # wc -l 看看有多少行

2、查看某一個頁面被訪問的次數:

grep "/index.php" log_file | wc -l

3、查看每一個IP訪問了多少個頁面:

awk '{++S[$1]} END {for (a in S) print a,S[a]}' log_file > log.txt
sort -n -t ' ' -k 2 log.txt # 配合sort進一步排序

4、將每個IP訪問的頁面數進行從小到大排序:

awk '{++S[$1]} END {for (a in S) print S[a],a}' log_file | sort -n

5、查看某一個IP訪問了哪些頁面:

grep ^111.111.111.111 log_file| awk '{print $1,$7}'

6、去掉搜索引擎統計的頁面:

awk '{print $12,$1}' log_file | grep ^\"Mozilla | awk '{print $2}' |sort | uniq | wc -l

7、查看2015年8月16日14時這一個小時內有多少IP訪問:

awk '{print $4,$1}' log_file | grep 16/Aug/2015:14 | awk '{print $2}'| sort | uniq | wc -l

8、查看訪問前十個ip地址

awk '{print $1}' |sort|uniq -c|sort -nr |head -10 access_log
# uniq -c 相當於分組統計並把統計數放在最前面

cat access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10 

cat access.log|awk '{counts[$(11)]+=1}; END {for(url in counts) print counts[url], url}

9、訪問次數最多的10個文件或頁面

 cat log_file|awk '{print $11}'|sort|uniq -c|sort -nr | head -10
 
 cat log_file|awk '{print $11}'|sort|uniq -c|sort -nr|head -20 
 
 awk '{print $1}' log_file |sort -n -r |uniq -c | sort -n -r | head -20 # 訪問量最大的前20個ip

10、通過子域名訪問次數,依據referer來計算,稍有不準

cat access.log | awk '{print $11}' | sed -e ' s/http:\/\///' -e ' s/\/.*//' | sort | uniq -c | sort -rn | head -20

11、列出傳輸大小最大的幾個文件

cat www.access.log |awk '($7~/\.php/){print $10 " " $1 " " $4 " " $7}'|sort -nr|head -100

12、列出輸出大於200000byte(約200kb)的頁面以及對應頁面發生次數

cat www.access.log |awk '($10 > 200000 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

13、如果日誌最後一列記錄的是頁面文件傳輸時間,則有列出到客戶端最耗時的頁面

cat www.access.log |awk '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100

14、列出最最耗時的頁面(超過60秒的)的以及對應頁面發生次數

cat www.access.log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100

15、列出傳輸時間超過 30 秒的文件

cat www.access.log |awk '($NF > 30){print $7}'|sort -n|uniq -c|sort -nr|head -20

16、列出當前服務器每一進程運行的數量,倒序排列

ps -ef | awk -F ' ' '{print $8 " " $9}' |sort | uniq -c |sort -nr |head -20

17、查看apache當前併發訪問數

#對比httpd.conf中MaxClients的數字差距多少。
netstat -an | grep ESTABLISHED | wc -l

18、可以使用如下參數查看數據

ps -ef|grep httpd|wc -l
#1388
#統計httpd進程數,連個請求會啓動一個進程,使用於Apache服務器。
#表示Apache能夠處理1388個併發請求,這個值Apache可根據負載情況自動調整。

netstat -nat|grep -i "80"|wc -l
#4341
#netstat -an會打印系統當前網絡鏈接狀態,而grep -i "80"是用來提取與80端口有關的連接的,wc -l進行連接數統計。
#最終返回的數字就是當前所有80端口的請求總數。

netstat -na|grep ESTABLISHED|wc -l
#376
#netstat -an會打印系統當前網絡鏈接狀態,而grep ESTABLISHED 提取出已建立連接的信息。 然後wc -l統計。
#最終返回的數字就是當前所有80端口的已建立連接的總數。

netstat -nat||grep ESTABLISHED|wc
#可查看所有建立連接的詳細記錄

19、輸出每個ip的連接數,以及總的各個狀態的連接數

netstat -n | awk '/^tcp/ {n=split($(NF-1),array,":");if(n<=2)++S[array[(1)]];else++S[array[(4)]];++s[$NF];++N} END {for(a in S){printf("%-20s %s\n", a, S[a]);++I}printf("%-20s %s\n","TOTAL_IP",I);for(a in s) printf("%-20s %s\n",a, s[a]);printf("%-20s %s\n","TOTAL_LINK",N);}'

20、其他的收集

# 分析日誌文件下 2012-05-04 訪問頁面最高 的前20URL  並排序 
cat access.log |grep '04/May/2012'| awk '{print $11}'|sort|uniq -c|sort -nr|head -20 

# 查詢受訪問頁面的URL地址中 含有 www.abc.com 網址的 IP 地址 
cat access_log | awk '($11~/\www.abc.com/){print $1}'|sort|uniq -c|sort -nr 

# 獲取訪問最高的10IP地址  同時也可以按時間來查詢
cat linewow-access.log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10  

#時間段查詢日誌時間段的情況
cat log_file | egrep '15/Aug/2015|16/Aug/2015' |awk '{print $1}'|sort|uniq -c|sort -nr|head -10 
 
 # 分析2015/8/152015/8/16 訪問"/index.php?g=Member&m=Public&a=sendValidCode"IP倒序排列
cat log_file | egrep '15/Aug/2015|16/Aug/2015' | awk '{if($7 == "/index.php?g=Member&m=Public&a=sendValidCode") print $1,$7}'|sort|uniq -c|sort -nr 

#($7~/\.php/) $7裏面包含.php的就輸出,本句的意思是最耗時的一百個PHP頁面
cat log_file |awk '($7~/\.php/){print $NF " " $1 " " $4 " " $7}'|sort -nr|head -100

# 列出最最耗時的頁面(超過60秒的)的以及對應頁面發生次數 
cat access.log |awk '($NF > 60 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100 

# 統計網站流量(G) 
cat access.log |awk '{sum+=$10} END {print sum/1024/1024/1024}' 

# 統計404的連接 
awk '($9 ~/404/)' access.log | awk '{print $9,$7}' | sort

# 統計http status. 
cat access.log |awk '{counts[$(9)]+=1}; END {for(code in counts) print code, counts[code]}' 
cat access.log |awk '{print $9}'|sort|uniq -c|sort -rn

# 每秒併發: 
watch "awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}' log_file|sort -k 2 -nr|head -n10"

# 帶寬統計 
cat apache.log |awk '{if($7~/GET/) count++}END{print "client_request="count}' 
cat apache.log |awk '{BYTE+=$11}END{print "client_kbyte_out="BYTE/1024"KB"}'

# 找出某天訪問次數最多的10IP 
cat /tmp/access.log | grep "20/Mar/2011" |awk '{print $3}'|sort |uniq -c|sort -nr|head

# 當天ip連接數最高的ip都在幹些什麼: 
cat access.log | grep "10.0.21.17" | awk '{print $8}' | sort | uniq -c | sort -nr | head -n 10

# 小時單位裏ip連接數最多的10個時段
awk -vFS="[:]" '{gsub("-.*","",$1);num[$2" "$1]++}END{for(i in num)print i,num[i]}' log_file | sort -n -k 3 -r | head -10

# 找出訪問次數最多的幾個分鐘 
awk '{print $1}' access.log | grep "20/Mar/2011" |cut -c 14-18|sort|uniq -c|sort -nr|head

# 取5分鐘日誌
if [ $DATE_MINUTE != $DATE_END_MINUTE ] ;then #則判斷開始時間戳與結束時間戳是否相等START_LINE=`sed -n "/$DATE_MINUTE/=" $APACHE_LOG|head -n1` #如果不相等,則取出開始時間戳的行號,與結束時間戳的行號 

# 查看tcp的鏈接狀態
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn 

netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}' 

netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}' 

netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}' 

netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn 

netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c
netstat -ant|awk '/ip:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' |sort -n 

netstat -ant|awk '/:80/{split($5,ip,":");++S[ip[1]]}END{for (a in S) print S[a],a}' |sort -rn|head -n 10 

awk 'BEGIN{printf ("http_code\tcount_num\n")}{COUNT[$10]++}END{for (a in COUNT) printf a"\t\t"COUNT[a]"\n"}'



#查找請求數前20IP(常用於查找攻來源): 
netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20 
netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20

#用tcpdump嗅探80端口的訪問看看誰最高 
tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

# 查找較多time_wait連接 
netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

# 找查較多的SYN連接 
netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

# 根據端口列進程 
netstat -ntlp | grep 80 | awk '{print $7}' | cut -d/ -f1

# 查看了連接數和當前的連接數 
netstat -ant | grep $ip:80 | wc -l 
netstat -ant | grep $ip:80 | grep EST | wc -l 

# 查看IP訪問次數 
netstat -nat|grep ":80"|awk '{print $5}' |awk -F: '{print $1}' | sort| uniq -c|sort -n 

Linux命令分析當前的鏈接狀況

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 

watch "netstat -n | awk '/^tcp/ {++S[\$NF]} END {for(a in S) print a, S[a]}'"  # 通過watch可以一直監控
LAST_ACK 5 #關閉一個TCP連接需要從兩個方向上分別進行關閉,雙方都是通過發送FIN來表示單方向數據的關閉,當通信雙方發送了最後一個FIN的時候,發送方此時處於LAST_ACK狀態,當發送方收到對方的確認(Fin的Ack確認)後才真正關閉整個TCP連接;

SYN_RECV 30  # 表示正在等待處理的請求數;

ESTABLISHED 1597 # 表示正常數據傳輸狀態; 

FIN_WAIT1 51 # 表示server端主動要求關閉tcp連接; 

FIN_WAIT2 504 # 表示客戶端中斷連接; 

TIME_WAIT 1057  # 表示處理完畢,等待超時結束的請求數; 

附錄

一月  Jan    January 
二月  Feb    February 
三月  Mar    March 
四月  Apr    April 
五月  May    May 
六月  June    June 
七月  July    July 
八月  Aug    Aguest 
九月  Sept    September 
十月  Oct    October 
十一月  Nov    November 
十二月  Dec    December
-------------------------END------------------------- 
轉載自:http://www.cnblogs.com/nixi8/p/4789817.html
發佈了37 篇原創文章 · 獲贊 4 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章