2012-05-05 1 views
3

Итак, я пытаюсь создать awk-скрипт, который определяет наибольшее количество попаданий в порядке высшей тройки. Я делаю это на основе покинуть апач веб-журнал, который выглядит какПолучение трех высоких нападающих веб-сайта через 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, а затем увеличивает счетчик совпадений для него в «счетчик посещений ", который индексируется IP-адресами. После этого я проверяю список ips, «ips», чтобы увидеть, есть ли IP-адрес попадания. Если IP-адрес не добавляется в массив «ips», а число индексов увеличивается на единицу. Теоретически, делая это, каждый индекс в «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».

Почему?

EDIT: К сожалению, это, как я печатаю окончательные результаты которых размещен сразу после «счетчик посещений» Еогеасп петли ...

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

Я не вижу никаких утверждений 'print'. Пожалуйста, разместите более полную версию своего сценария. Кстати, все в порядке для повторного использования переменных - нет необходимости в 'indexxx'. –

+0

Вы действительно не должны считать хиты для таких вещей, как код ответа 404 на 'favicon.ico'. Кроме того, множественные связанные выборки не являются отдельными ударами. Если кто-то обращается к одной странице с четырьмя изображениями, одной каскадной таблицей стилей и одним значком, то есть не пять попаданий !!! – Kaz

+1

См. Мой отредактированный ответ, в котором исправлено упоминание Джонатана Леффлера. –

ответ

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: Да, это должно произойти. Я не смотрел на общую функциональность - только на ближайшую проблему. Я отредактирую свой ответ. –

Смежные вопросы