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

一、查看有多少個IP訪問:php

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

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

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

三、查看每個IP訪問了多少個頁面:apache

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

四、將每一個IP訪問的頁面數進行從小到大排序:服務器

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

五、查看某一個IP訪問了哪些頁面:網絡

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

六、去掉搜索引擎統計的頁面:併發

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

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

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

八、查看訪問前十個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}

九、訪問次數最多的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

十、經過子域名訪問次數,依據referer來計算,稍有不許url

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

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

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

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

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

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

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

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

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

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

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

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

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

1七、查看apache當前併發訪問數

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

1八、可使用以下參數查看數據

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
#可查看全部創建鏈接的詳細記錄

1九、輸出每一個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 訪問頁面最高 的前20個 URL  並排序 
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 

# 獲取訪問最高的10個IP地址  同時也能夠按時間來查詢
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/15 到 2015/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"}'

# 找出某天訪問次數最多的10個IP 
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"}'



#查找請求數前20個IP(經常使用於查找攻來源): 
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
相關文章
相關標籤/搜索