69 lines
2.1 KiB
Plaintext
69 lines
2.1 KiB
Plaintext
|
#!/usr/bin/python
|
||
|
# encoding: utf-8
|
||
|
|
||
|
"""
|
||
|
Skript:
|
||
|
|
||
|
PATH=path/to/bin:$PATH
|
||
|
cat access.log | top4 | head
|
||
|
|
||
|
"""
|
||
|
|
||
|
# Loo tühi dict tüüpi objekt, siia korjame kokku URL -> mitu korda külastati vastendused
|
||
|
hits = {}
|
||
|
|
||
|
try:
|
||
|
import sys
|
||
|
filename = sys.argv[1]
|
||
|
if filename.endswith(".gz"):
|
||
|
import gzip
|
||
|
stream = gzip.open(filename)
|
||
|
else:
|
||
|
stream = open(filename)
|
||
|
except IndexError:
|
||
|
stream = sys.stdin
|
||
|
sys.stderr.write("Loen standardsisendist...\n")
|
||
|
|
||
|
# Käi ridahaaval fail läbi
|
||
|
for line in stream:
|
||
|
|
||
|
# Kui rea sees ei esine sõnet GET siis jäta vahele
|
||
|
if "GET" not in line:
|
||
|
# Hüppa järgmise tsükli algusse
|
||
|
continue
|
||
|
|
||
|
# Rea sees oli GET, nüüd võime proovida lõpikuda rida tühikute järgi massiiviks
|
||
|
fields = line.split()
|
||
|
|
||
|
# Massiivi indeksid algavad nullist, seitsmenda tulba indeks on 6
|
||
|
path = fields[6]
|
||
|
|
||
|
# Kontrollime kas URL on juba võtmena kasutuses dict objektis
|
||
|
if path in hits:
|
||
|
# Kui on siis lisame ühe juurde
|
||
|
hits[path] = hits[path] + 1
|
||
|
else:
|
||
|
# Kui ei ole siis määra väärtuseks 1
|
||
|
hits[path] = 1
|
||
|
|
||
|
# Kuna dict tüüpi objekti ei saa sorteerida tuleb ta kõigepealt viia sorteeritavale kujule
|
||
|
# nagu nt list:
|
||
|
hits = hits.items()
|
||
|
|
||
|
# Nüüd hits on massiiv kahestest massiividest (path, count)
|
||
|
# Sellise asja sorteerimiseks saab kasutada list objekti funktsiooni sort
|
||
|
# Sorteerimisel on vaja ette anda ka funktsioon mis nopib välja asja mille järgi sorteerida
|
||
|
# See on siin argument nimega key, millele on väärtuseks antud
|
||
|
# nimetu (anonüümne, lambda) funktsioon mis massiivi iga elemendi (path, count)
|
||
|
# kohta tagastab count negatiivse väärtuse
|
||
|
hits.sort(key=lambda (path,count):-count)
|
||
|
|
||
|
# Massiiv on nüüd sorteeritud, esimese 10 vaste kuvamiseks saame massiviist võtta alammassiivi [:10]
|
||
|
# Süntaks [algus:lõpp] kehtib samamoodi nii massiividel (list, tuple) kui ka sõnedel
|
||
|
# Kui algus jäetakse vahele asendatakse see algusega
|
||
|
# Kui lõpp jäetakse vahele asendatakse see lõpuga
|
||
|
# Indeksid võivad negatiivsed olla
|
||
|
for path, count in hits:
|
||
|
print "% 9d %s" % (count, path)
|
||
|
|