2012-05-05 46 views
3

因此,我正在嘗試製作一個awk腳本,以最高三的順序決定最高命中率。我關閉這個基於Apache的Web日誌,看起來像通過awk獲得三個最高網站擊球手

192.168.198.92 - - [22/Dec/2002:23:08:37 -0400] "GET /HTTP/1.1" 200 6394 www.yahoo.com "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1...)" "-" 
192.168.198.92 - - [22/Dec/2002:23:08:38 -0400] "GET /images/logo.gif HTTP/1.1" 200 807 www.yahoo.com "http://www.some.com/" "Mozilla/4.0 (compatible; MSIE 6...)" "-" 
192.168.72.177 - - [22/Dec/2002:23:32:14 -0400] "GET /news/sports.html HTTP/1.1" 200 3500 www.yahoo.com "http://www.some.com/" "Mozilla/4.0 (compatible; MSIE ...)" "-" 
192.168.72.177 - - [22/Dec/2002:23:32:14 -0400] "GET /favicon.ico HTTP/1.1" 404 1997 www.yahoo.com "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3)..." "-" 
192.168.72.177 - - [22/Dec/2002:23:32:15 -0400] "GET /style.css HTTP/1.1" 200 4138 www.yahoo.com "http://www.yahoo.com/index.html" "Mozilla/5.0 (Windows..." "-" 
192.168.72.177 - - [22/Dec/2002:23:32:16 -0400] "GET /js/ads.js HTTP/1.1" 200 10229 www.yahoo.com "http://www.search.com/index.html" "Mozilla/5.0 (Windows..." "-" 
192.168.72.177 - - [22/Dec/2002:23:32:19 -0400] "GET /search.php HTTP/1.1" 400 1997 www.yahoo.com "-" "Mozilla/4.0 JJohnJoJJJJJoJJoJJJJJoJJohJJJJJJJJJJJJohnJohJoJoJJJoJJ 

要做到這一點做的我做的:

$1 ~ /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ { 
hitCounter[$1]++ 
notIndexed=1 
for(i in ips) { 
if (i==$1) { notIndexed=0 } 
} 
if(notIndexed==1) { 
ips[indexx]=$1 
indexx++ 
} 
} 

這條線檢測IP,然後在「隱私權|發佈廣告遞增命中計數爲它「由IPs索引的數組。在此之後,我檢查ips的列表,「ips」,看看命中的IP是否已經在那裏。如果沒有將IP添加到「ips」數組,並且索引計數增加1。理論上,通過這樣做,「ips」中的每個索引都應與「hitCounter」中的索引相關聯。最後,我有...

END { 

indexxx=0 
for (i in hitCounter) { 
if (i>hitCounter[firstIP]) 
    firstIP=ips[indexxx] 
else if (i>hitCounter[secondIP]) 
    secondIP=ips[indexxx] 
else 
    thirdIP=ips[indexxx] 

indexxx++ 
} 

} 

正是在這裏,我走在「隱私權|發佈廣告」通過IP命中計數,在三個高命中變量比較他們的命中和,如果IP命中是大於一個在三個高命中變量內容中,我將其設置爲當前IP。

這看起來應該對我有用,我應該得到「192.168.72.177 192.168.198.92」作爲輸出,而是我得到「192.168.198.92 192.168.198.92」。

爲什麼?

編輯:對不起,我這是怎麼打印爲「隱私權|發佈廣告」 foreach循環之後放置最後的結果......

print "The most hits were from "firstIP" "secondIP" "thirdIP 
+0

我沒有看到任何'print'語句。請發佈您的腳本的更完整版本。順便說一下,可以重用變量 - 不需要'indexxx'。 –

+0

你真的不應該爲'favicon.ico'上的404響應代碼計算點擊次數。此外,多個相關的提取不是單獨的提示。如果有人訪問一個頁面有四個圖像,一個級聯樣式表和一個favicon,這不是五個命中! – Kaz

+1

請參閱我編輯的答案,它有一個由Jonathan Leffler指出的解決方法。 –

回答

2

,而不必每次搜索的IP,以查看它是否存在的在IP地址列表,我應該這樣做:

$1 ~ /[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/ { 
    hitCounter[$1]++ 
} 


END { 

    for (ip in hitCounter) { 
     if (hitCounter[ip] > hitCounter[firstIP]) 
      thirdIP = secondIP 
      secondIP = thirdIP 
      firstIP = ip 
     else if (hitCounter[ip] > hitCounter[secondIP]) 
      thirdIP = secondIP 
      secondIP = ip 
     else 
      thirdIP = ip 

    } 

} 

我想你混淆的部分是在想,i是價值,而不是在for (i in hitCounter)的關鍵。

+0

哦,是的我不確定awk如何處理,假設「我」的確是價值不是關鍵。這使事情變得更簡單。謝謝! – user578086

+1

如果你獲得了新的第一名IP,那麼舊的第一名移到第二位,而舊的第二名到第三位?如果你獲得新的第二名IP,那麼舊的第二名將移至第三名? –

+0

@JonathanLeffler:是的,那應該發生。我沒有看到整體功能 - 只是眼前的問題。我會編輯我的答案。 –