#!/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)