Lisatud bin kaust näidistega

This commit is contained in:
2018-06-17 23:14:16 +03:00
parent ae9c681c6d
commit 4c1b365b06
10 changed files with 409 additions and 33 deletions

68
bin/top4 Executable file
View File

@@ -0,0 +1,68 @@
#!/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)