python anfänger - logfile auswerten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
BlackJack

Beitragvon BlackJack » Dienstag 13. Januar 2009, 16:43

Funktioniert aber nicht weil Zeile 10 mit einem `TypError` aussteigt: "'NoneType' object is not iterable".

Es wäre aber sowieso intelligenter die IDs in einem `dict` oder `collections.defaultdict` beim Einlesen zu zählen, als für jede ID die ganze Liste von vorne bis hinten zum Zählen zu durchlaufen.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Dienstag 13. Januar 2009, 16:51

Stimmt, das kommt davon wenn mans knackig halten will :( Gleich mal berichtigt ;)
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Beitragvon krischeu » Dienstag 13. Januar 2009, 17:05

gibt es hierfür eventuell auch noch ein kleines Beispiel?
Mit dict hab ich noch nichts getestet.
Welchen Vorteil hat denn das?
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

Beitragvon jonas » Dienstag 13. Januar 2009, 17:23

Ein Dictionary könntest du vorher mit Usern und ID's füttern und dann würdest du z.B. die ID als Schlüssel benutzen um den jeweiligen User zu
finden (geht natürlich nur wenn du weißt, welche User du erwartest :wink: )

Das könnte folgendermaßen aussehen:

Code: Alles auswählen

userdict = {123:"Hans", 231:"Dieter", 464:"Gisela"} # usw...

ID = [123, 231, 464]

# Dann brauchst du hinterher nur noch so was
# wie:
for i in ID:
    print i, userdict[i]

Deine Ausgabe wäre dann z.B:

Code: Alles auswählen

123 Hans
231 Dieter
464 Gisela


MfG Jonas :wink:
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Dienstag 13. Januar 2009, 18:26

Hmm ... Jonas `ID' ist einfacher über `userdict.keys()' zu konstruieren ;) und über Dictionaries kann man direkt iterieren (oder auch über die Listen, die Methoden wie keys bereitstellen)

Zu dem Grundproblem .. wenn du die Einträge durch `set' jagst, dann gibt es keine doppelten oder mehrere Einträge und somit keine die man zählen kann ;)
BlackJack

Beitragvon BlackJack » Dienstag 13. Januar 2009, 19:18

@krischeu: Der Vorteil das in einem `dict` gleich beim Einlesen zu zählen ist, das man kein Programm mit quadratischer Laufzeit bekommt, sondern eines das in linearer Zeit läuft. Jeweils in Bezug auf die Zeilenanzahl in der Log-Datei gesehen.
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Beitragvon krischeu » Donnerstag 15. Januar 2009, 14:21

Hallo,
es ist soweit gediehen und funktionabel.
Zählen geht jetzt auch. Ausgabe ist z.B.
1120 24
1176 13
1021 58
1009 94
1013 44
Aber wie kann ich os.system('ypcat passwd') zum weiterverabeiten in eine sequenz schreiben (den output ntürlich)?
Es sollte schon mit ypcat funktionieren, wenn Benutzer gelöscht werden oder dazu kommen, will ich nicht jedes mal die Scripte anpassen.



Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import string
import os


try:
 # FILE oeffen und in eine SEQUENZ / ARRAY schreiben
 logfile = file("/var/log/auswertung/logfile.txt", "r")         # Oeffnen des Files
 logfileinhalt = [line.rstrip('\n') for line in logfile.readlines()]   # einlesen des Fileinhaltes
 inhalt_logfile = []                     # Leere Sequenz / Array erstellen um dann das LOG-File hierrein zu speichern
 for line in logfileinhalt:
   a = line
   inhalt_logfile.append(a)

finally:
 logfile.close()                     # Datei schliessen



# ARRAY / Sequenz sortieren
inhalt_logfile.sort()                          # Sortieren des Inhaltes der Sequenz/Array

# doppelte Eintraege loeschen und STRINGS zaehlen
userID = list(set(inhalt_logfile))                    # Neue Sequenz/Array mit allen Eintraegen aus der originalen Sequenz
#                                     # ABER ohne doppelte Eintraege
for checkuserID in userID:
 print checkuserID,
 print inhalt_logfile.count(checkuserID)

# userID einem Benutzernamen zuordnen
#
os.system('ypcat passwd')                  # Ausgabe von ypcat in die Variable var (STRING)
# variable = [line.rstrip('\n') for line in os.system('ypcat passwd').readlines()]
#array=[]                        # leeres Array erstellen
#for zeile in var:
# spalte=zeile.split()
# array.append(zeile)
# print array[1,1]
lunar

Beitragvon lunar » Donnerstag 15. Januar 2009, 14:26

Lies die Doku zum subprocess-Modul und vergiss am besten, dass es os.system() überhaupt gibt.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Beitragvon theliquidwave » Donnerstag 15. Januar 2009, 15:13

Hi.
Mal eine Frage zu cofi's Code.
Wieso schreibt er das Öffnen und Auslesen in einen try-Block, wenn dieser eh ohne except endet? Was bringt es, dass finally einzubauen? Käme doch auf's selbe Hinaus, es gänzlich ohne zu belassen, oder nicht?

~ Chris
Grüßle.
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Beitragvon krischeu » Donnerstag 15. Januar 2009, 15:56

Also,
das hab ich mir mal angeschaut:
http://pydoc.org/2.5.1/subprocess.html

das hab ich dann mal ausprobiert, weil es meinem Wunsch am naechsten kam. (import subprocess oben reingeschrieben!)

Code: Alles auswählen

Replacing shell pipe line
-------------------------
output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]


Allerdings bekomme ich immer noch eine Fehlermeldung:
Traceback (most recent call last):
File "./filter4.py", line 58, in <module>
p1 = Popen(["dmesg"], stdout=PIPE)
NameError: name 'Popen' is not defined

Ist ja hartes Brot die Ausgabe aus einer Shell weiter zu verarbeiten ...[/code]
lunar

Beitragvon lunar » Donnerstag 15. Januar 2009, 16:14

Das ist jetzt aber Grundlagenwissen. Es sollte eigentlich klar sein, dass du die entsprechenden Attribute vorher aus "subprocess" importieren muss.
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Beitragvon cofi » Donnerstag 15. Januar 2009, 16:17

@chrisber Es gibt kein finally ohne try ;) Und da Dateien auf jedenfall geschlossen werden sollten - ungeachtet von Exceptions usw. -, sollte man sie in einem try-Block öffnen und sie im finally-Block schliessen.

Mit 2.6 und dem with-Statement ist das aber für den meisten Code ein alter Hut.
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Donnerstag 15. Januar 2009, 17:45

krischeu hat geschrieben:das hab ich dann mal ausprobiert, weil es meinem Wunsch am naechsten kam. (import subprocess oben reingeschrieben!)


Schreib mal lieber

Code: Alles auswählen

from subprocess import PIPE, Popen
rein. ;)
shcol (Repo | Doc | PyPi)
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Beitragvon krischeu » Freitag 16. Januar 2009, 14:00

Jup,
das hat gefehlt.

Jetzt funktioniert das schon mal mit dem einlesen deer Ausgabe eines Shell-Befehls.
Die Ausgabe von ypcat passwd liegt nun im array. Jeweils als einzelne Buchstaben.
['V', 'M', '0', '0', '1', '$', ':', 'x', ':', '3', '0', '2', '8', ':', '1', '0', '2', '0', '0', ':', 'N', 'T', 'M', 'a', 'c', 'h', 'i', 'n', 'e', ':', '/', 'n', 'e', 't', '/', 'h', 'o', 'm', 'e', '/', 'V', 'M', '0', '0', '1', '$', ':', '/', 'b', 'i', 'n', '/', 't', 'c', 's', 'h', '\n',
...
usw.
Aus dem ganzen Wust sollte nun unter rühren vm001 3028 10200 gemacht werden.
ich dachte da grundsätzlich an sowas wie:

Code: Alles auswählen

array=[]
zeile=''#ein leerer string
for buchstabe in ypcatpasswdarray:
   if buchstabe == '\n':
      zeile=zeile+buchstabe #zeielnstring zusammensetzen
      array.append(zeile)
      zeile='' #zeilen inhalte  loeschen
   else:
      zeile.append(buchstabe)


Gibt es da was eleganteres?
Benutzeravatar
snafu
User
Beiträge: 5427
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Beitragvon snafu » Freitag 16. Januar 2009, 15:57

Wie hast du denn das geschafft? Normalerweise müsste die Ausgabe ein String und keine Liste sein. Zum Zusammenfügen:

Code: Alles auswählen

In [11]: out = ['V', 'M', '0', '0', '1', '$', ':', 'x', ':', '3', '0', '2', '8', ':', '1', '0', '2', '0', '0', ':', 'N', 'T', 'M', 'a', 'c', 'h', 'i', 'n', 'e', ':', '/', 'n', 'e', 't', '/', 'h', 'o', 'm', 'e', '/', 'V', 'M', '0', '0', '1', '$', ':', '/', 'b', 'i', 'n', '/', 't', 'c', 's', 'h', '\n', 'b', 'l', 'a', '\n', 'b', 'l', 'u', 'p', 'p']

In [12]: ''.join(out)
Out[12]: 'VM001$:x:3028:10200:NTMachine:/net/home/VM001$:/bin/tcsh\nbla\nblupp'

In [13]: print ''.join(out)
VM001$:x:3028:10200:NTMachine:/net/home/VM001$:/bin/tcsh
bla
blupp
shcol (Repo | Doc | PyPi)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder