常用伺服器日誌分析命令

技術小阿哥發表於2017-11-26

1. 檢視有多少個IP訪問:

1
awk `{print $1}` log_file|sort|uniq|wc -l

2. 檢視一個頁面被訪問的次數

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

3. 檢視每一個IP訪問多少個頁面

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

4. 將每個IP訪問的頁面數從小到大排序

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

5. 檢視某一個IP訪問了多少頁面

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

6. 去掉搜尋引擎統計的頁面

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

7. 檢視某個時間段(2015年8月16日14時)有多少IP訪問

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

8. 檢視訪問前10個IP地址

1
2
3
4
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個頁面或檔案

1
2
3
4
5
 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來計算,稍有不準

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

11. 列出傳輸大小最大的幾個檔案

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

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

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

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

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

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

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

15. 列出傳輸時間超過 30 秒的檔案

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

16. 列出當前伺服器每一程式執行的數量,倒序排列

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

17. 檢視apache當前併發訪問數

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

18. 可以使用如下引數檢視資料

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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的連線數,以及總的各個狀態的連線數

1
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
", a, S[a]);++I}printf("%-20s %s
","TOTAL_IP",I);for(a in s) printf("%-20s %s
",a, s[a]);printf("%-20s %s
","TOTAL_LINK",N);}`

20. 其他的收集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# 分析日誌檔案下 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," ",state[key]}` 
 
netstat -n | awk `/^tcp/ {++arr[$NF]};END {for(k in arr) print k," ",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 count_num
")}{COUNT[$10]++}END{for (a in COUNT) printf a" "COUNT[a]"
"}`
 
 
 
#查詢請求數前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}` sortuniq -c|sort -n

Linux命令分析當前的連結狀況

1
2
3
4
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可以一直監控
1
2
3
4
5
6
7
8
9
10
11
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  # 表示處理完畢,等待超時結束的請求數;

附錄

1
2
3
4
5
6
7
8
9
10
11
12
一月      Jan    January 
二月      Feb    February 
三月      Mar    March 
四月      Apr    April 
五月      May    May 
六月      June   June 
七月      July   July 
八月      Aug    Aguest 
九月      Sept   September 
十月      Oct    October 
十一月    Nov    November 
十二月    Dec    December

轉載自http://www.cnblogs.com/nixi8/p/4789817.html


相關文章