, последнее обновление:

Подсчитываем уникальные адреса в логах Apache

Внимание: данный гайд был написан в начале 2010х. В настоящее время есть много более “правильных” инструментов для выполнения этой задачи.

Сидел я, значит, сидел, никого не трогал, вдруг смотрю – кто-то у меня во весь мой канал что-то качает. Смотрю логи – какая-то германщина с меня рекурсивно качает музыку. Ну и тут мне пришла идея накатать скриптец, который «выдирает» из логов уникальные IP, находит PTR, считает количество вхождений:

#!/usr/bin/python2
 
import os, sys, commands, operator
 
ips = {}
rawips = []
LOGFILE = "/var/log/httpd/pztrn.ru-access_log"
LINES = 0
SHOW_TOP = 20
 
if LINES == 0:
    output = commands.getoutput("cat %s | awk {' print $1 '}" % (LOGFILE)).split("\n")
else:
    output = commands.getoutput("cat %s | tail -n %s | awk {' print $1 '}" % (LOGFILE, LINES)).split("\n")
ipscount = len(output)
curip = 1
 
for ip in output:
    sys.stdout.write("\rProcessing: %s/%s ips" % (curip, ipscount))
    sys.stdout.flush()
    if ip not in rawips:
        ptr = commands.getoutput(" host -t PTR " + ip)
        ips[ip] = {}
        ips[ip]["ptr"] = ptr.split(" ")[-1:][0]
        ips[ip]["count"] = 1
        rawips.append(ip)
    else:
        ips[ip]["count"] += 1
    curip +=1
 
print "\nSorting...\n"
sorted_ips = sorted(ips.iteritems(), key=operator.itemgetter(1), reverse=True)
 
showed = 1
for data in sorted_ips:
    if SHOW_TOP != 0:
        if showed == SHOW_TOP:
            exit()
        print """%s, PTR: %s, Count: %s""" % (data[0], data[1]["ptr"], data[1]["count"])
        showed += 1
    else:
        print """%s, PTR: %s, Count: %s""" % (data[0], data[1]["ptr"], data[1]["count"])

Вывод будет таков:

[ /home/pztrn/bin ] % ./apache-ips.py
Processing: 15120/15120 ips
Sorting...
  
66.249.66.169, PTR: crawl-66-249-66-169.googlebot.com., Count: 2771
66.249.66.203, PTR: crawl-66-249-66-203.googlebot.com., Count: 2436
87.250.253.243, PTR: spider-87-250-253-243.yandex.com., Count: 1728
66.249.72.205, PTR: crawl-66-249-72-205.googlebot.com., Count: 846
84.157.180.23, PTR: p549DB417.dip.t-dialin.net., Count: 590
127.0.0.1, PTR: 3(NXDOMAIN), Count: 580
66.249.72.217, PTR: crawl-66-249-72-217.googlebot.com., Count: 536
66.249.66.68, PTR: crawl-66-249-66-68.googlebot.com., Count: 479
66.249.66.182, PTR: crawl-66-249-66-182.googlebot.com., Count: 432
95.108.158.235, PTR: imparser05.yandex.ru., Count: 409
66.249.66.10, PTR: crawl-66-249-66-10.googlebot.com., Count: 328
66.249.66.84, PTR: crawl-66-249-66-84.googlebot.com., Count: 231
66.249.72.212, PTR: crawl-66-249-72-212.googlebot.com., Count: 148
66.249.72.232, PTR: crawl-66-249-72-232.googlebot.com., Count: 112
::1, PTR: localhost., Count: 107
66.249.66.140, PTR: crawl-66-249-66-140.googlebot.com., Count: 98
85.12.199.122, PTR: 3(NXDOMAIN), Count: 97
209.85.238.228, PTR: rate-limited-proxy-209-85-238-228.google.com., Count: 96
209.85.238.162, PTR: rate-limited-proxy-209-85-238-162.google.com., Count: 86