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.
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Montag 19. Januar 2009, 15:49

Hallo,
hier der aktuelle Stand:

Die Frage ist nun, wie kann ich die Ausgabe die so aussehen kann ( 3 Möglichkeiten) separieren und in Array oder String bringen?

USERDATENSATZ: heinz:x:1121:10101:Heinz Krischeu:/net/home/heinz:/bin/bash
TESTTEMP heinz:x:1121:10101:Heinz Krischeu:/net/home/heinz:/bin/bash
YPCATPASSWDARRAY ['h', 'e', 'i', 'n', 'z', ':', 'x', ':', '1', '1', '2', '1', ':', '1', '0', '1', '0', '1', ':', 'H', 'e', 'i', 'n', 'z', ' ', 'K', 'r', 'i', 's', 'c', 'h', 'e', 'u', ':', '/', 'n', 'e', 't', '/', 'h', 'o', 'm', 'e', '/', 'h', 'e', 'i', 'n', 'z', ':', '/', 'b', 'i', 'n', '/', 'b', 'a', 's', 'h', '\n']

Gibt es sowas wie find bis zum ":" --> dann nächtes Feld ...
Die Felder entsprechen denen aus userlogin,userID, GruppenID, etc.



Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import string 
import os 
import subprocess
from subprocess import PIPE, Popen
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					# Benoetigte IMPORTS sind:
#									# "import subprocess"
#									# "from subprocess import PIPE, Popen"
ypcatpasswdarray=[]							# leeres Array erstellen
ypcatpasswdshell = Popen(["ypcat", "passwd"], stdout=PIPE)		# Ausgabe von "ypcat passwd" wird gepiped 
output = ypcatpasswdshell.communicate()[0]				# Die "0" gibt stdout zurück (holt sich die Ausgabe der PIPE)
									# Die "1" gibt stderr zurück
print output
# Ausgabe von ypcat passwd wird in das Array geleitet
for line in output:							# Nimmt den STRING "output" und leitet alles in das Array 
	a = line
	ypcatpasswdarray.append(a)
	
# print ypcatpasswdarray[5]						# Zaehlt 6 Zeichen (von "0" bis "5")
# print ypcatpasswdarray						# Ausgabe des Arrays

# 
# Aus dem Array ypcatpasswdarray wird tmparray 				# Aus einzelnen Buchstaben wird ein Datensatz
# print tmparray[0] gibt einen einzelnen Datensatz aus			# Hier den ersten
tmpstring=[]
passwdzeile=''								#ein leerer string
for einzelnerbuchstabe in ypcatpasswdarray:
   if einzelnerbuchstabe == '\n':
      passwdzeile=passwdzeile+einzelnerbuchstabe 			#zeilenstring zusammensetzen
      tmpstring.append(passwdzeile)
      passwdzeile='' 							#zeileninhalte  loeschen
   else:
      passwdzeile+=(einzelnerbuchstabe)


testtemp = ''.join(ypcatpasswdarray)


print tmpstring[2:3]
print testtemp[112:130]
print ypcatpasswdarray[112:130]
[/code]
Benutzeravatar
cofi
Moderator
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Montag 19. Januar 2009, 16:22

Bau es zu einem langen String zusammen (siehe snafu) und wende .split(":") auf den String an. Das gibt eine Liste von Strings zurück.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 19. Januar 2009, 17:08

Warum so kompliziert?

Dieses ``YPCATPASSWDARRAY`` ist so nützlich wie das fünfte Rad am Wagen. Da würde man direkt den String der Ausgabe von ``ypcat`` nehmen, zeilenweise iterieren und an den Doppelpunkten splitten.
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Donnerstag 22. Januar 2009, 15:36

Hallo,
ich bräuchte noch mal ein bischen hilfe.
ich habe ein array. dort gibt es diverse strings. hauptsächlich sind es entweder zahlen-strings oder buchstaben-strings.
ich bräuchte nun eine if abfrage, die testet, ob der string aus zahlen besteht oder aus buchstaben.

Code: Alles auswählen

import sys, string
import subprocess
from subprocess import PIPE, Popen
import os 
def logfile_oeffnen_und_auswerten():
    import string
    # FILE oeffen und in eine SEQUENZ / ARRAY schreiben
    logfile = file("/var/log/auswertung/logfile.txt", "r")			
    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 zeile in logfileinhalt:
       inhalt_logfile.append(zeile)
    logfile.close()							# Datei schliessen
    # Doppelte Eintraege loeschen 
    userID = list(set(inhalt_logfile))					# Neue Sequenz/Array mit allen Eintraegen aus der originalen Sequenz
    i=0

###                                              ###
    for i in userID:
	if isinstance ("i", int):
		print "zahl", i
	else:
		print "Buchstabe", i
###                                              ###
	
    # Ausgabe der UserID/Username und der Stundenanzahl			# ABER ohne doppelte Eintraege
    ausgewertetes_logfile_array = []
    for checkuserID in userID:
     ausgewertetes_logfile_array.append(checkuserID)
     ausgewertetes_logfile_array.append(inhalt_logfile.count(checkuserID))
    return ausgewertetes_logfile_array
DasIch
User
Beiträge: 2450
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Donnerstag 22. Januar 2009, 16:15

Code: Alles auswählen

'1'.isdigit()
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Donnerstag 22. Januar 2009, 16:30

Hallo,
ja stimmt, aber ich habe noch das python 2.5.2.
Ein Update von ubuntu 8.04 64 lts auf 8.10 64 lts könnte ich noch machen. Dort gibt es das python 3.0.

Ein Update des Python auf meinem bestehendem System erschien mir doch zu aufwänding.
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 22. Januar 2009, 16:38

Davon mal angesehen, dass niemand gesagt hat, du solltest auf Python 3.0 aktualisieren...
krischeu hat geschrieben:Ein Update von ubuntu 8.04 64 lts auf 8.10 64 lts könnte ich noch machen. Dort gibt es das python 3.0.
Ubuntu 8.10 ist auch kein LTS-Release. Und Python 2.6 gibt es bischer in keiner Ubuntu-Version.
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Dienstag 27. Januar 2009, 09:48

Hallo,
.isdigit gibt es auch bei mit - Python 2.5.2 ;-)

Wenn ich es direkt in der Python-"Shell" ausführe funktioniert das auch.

Code: Alles auswählen

>>> '1232'.isdigit()
True
>>> '1232a'.isdigit()
False
>>> '1232 '.isdigit()
Hier mein codesnippet:

Code: Alles auswählen

def logfile_oeffnen_und_auswerten():
    import string
    # FILE oeffen und in eine SEQUENZ / ARRAY schreiben
    logfile = file("/var/log/auswertung/logfile.txt", "r")			
    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 zeile in logfileinhalt:
       inhalt_logfile.append(zeile)
    logfile.close()							# Datei schliessen
    # Doppelte Eintraege loeschen 
    userID = list(set(inhalt_logfile))					# Neue Sequenz/Array mit allen Eintraegen aus der originalen Sequenz
    # Testen ob STRING Buchstaben oder Zahlen enthält
    i=0
    for i in userID:
	ergebnis=userID.isdigit()	
	if ergebnis == True:
		print "zahl", i
	else:
		print "Buchstabe", i
	
    # Ausgabe der UserID/Username und der Stundenanzahl			# ABER ohne doppelte Eintraege
    ausgewertetes_logfile_array = []
    for checkuserID in userID:
     ausgewertetes_logfile_array.append(checkuserID)
     ausgewertetes_logfile_array.append(inhalt_logfile.count(checkuserID))
    return ausgewertetes_logfile_array

Fehlermeldung:
heinz@pippin:~/python$ ./auswertung2.py
Traceback (most recent call last):
File "./auswertung2.py", line 144, in <module>
print logfile_oeffnen_und_auswerten()
File "./auswertung2.py", line 28, in logfile_oeffnen_und_auswerten
ergebnis=userID.isdigit()
AttributeError: 'list' object has no attribute 'isdigit'


Jemand ne Idee? Gibt es wieder ein Problem mit den Imports?
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dienstag 27. Januar 2009, 09:51

Nein, es ist wie die Fehlermeldung sagt: ``isdigit`` gibt es als Methode auf Strings, aber du führst es auf einer Liste aus, die natürlich dann kein ``isdigit``-Attribut kennt.
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Dienstag 27. Januar 2009, 09:59

Suuuper,
daaanke.

Hier die Lösung:

Code: Alles auswählen

def logfile_oeffnen_und_auswerten():
    import string
    # FILE oeffen und in eine SEQUENZ / ARRAY schreiben
    logfile = file("/var/log/auswertung/logfile.txt", "r")			
    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 zeile in logfileinhalt:
       inhalt_logfile.append(zeile)
    logfile.close()							# Datei schliessen
    # Doppelte Eintraege loeschen 
    userID = list(set(inhalt_logfile))					# Neue Sequenz/Array mit allen Eintraegen aus der originalen Sequenz
    # Testen ob STRING Buchstaben oder Zahlen enthält
    i=0
    for i in userID:
	ergebnis=i.isdigit()	# HIER muß "i" abgefragt werden.
	if ergebnis == True:
		print "zahl", i
	else:
		print "Buchstabe", i
	
    # Ausgabe der UserID/Username und der Stundenanzahl			# ABER ohne doppelte Eintraege
    ausgewertetes_logfile_array = []
    for checkuserID in userID:
     ausgewertetes_logfile_array.append(checkuserID)
     ausgewertetes_logfile_array.append(inhalt_logfile.count(checkuserID))
    return ausgewertetes_logfile_array
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Donnerstag 29. Januar 2009, 10:20

Hier ist nun mein ganzes Skriptchen ...
Funktioniert tadelos. Leider etwas langsam.
Hat jemand mal einen Tip, wie man das in der Auswertung optimieren kann?

Code: Alles auswählen

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



	# FUNKTIONSDEFINITIONEN
	
import sys, string
import subprocess
from subprocess import PIPE, Popen
import os 


def logfile_oeffnen_und_auswerten():
    import string
    # FILE oeffen und in eine SEQUENZ / ARRAY schreiben
    logfile = file("/var/log/auswertung/logfile.txt", "r")			
    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 zeile in logfileinhalt:
       inhalt_logfile.append(zeile)
    logfile.close()							# Datei schliessen
    # Testen ob STRING Buchstaben oder Zahlen enthält
    i=0
    getestetes_inhalt_logfile = []
    for i in inhalt_logfile:
	ergebnis=i.isdigit()	
	if ergebnis == True:
		ergebnis = yppasswdauswertung(i,"uid_username")
		getestetes_inhalt_logfile.append(ergebnis)
	else:
		ergebnis = i
		getestetes_inhalt_logfile.append(ergebnis)
    inhalt_logfile = getestetes_inhalt_logfile
    # Doppelte Eintraege loeschen 
    userID = list(set(inhalt_logfile))					# Neue Sequenz/Array mit allen Eintraegen aus der originalen Sequenz
    # Ausgabe der UserID/Username und der Stundenanzahl			# ABER ohne doppelte Eintraege
    ausgewertetes_logfile_array = []
    #    for checkuserID in userID:
    for checkuserID in userID:
     ausgewertetes_logfile_array.append(checkuserID)
     ausgewertetes_logfile_array.append(inhalt_logfile.count(checkuserID))
    return ausgewertetes_logfile_array

def suche_option_auswahl():
 	option_suche = raw_input ("WAS soll gesucht werden? \n \n"
				  "  userid.........................................................uid\n"
				  "  username.......................................................username\n"
		 		  "  groupid........................................................gid\n" 
				  "  username wird eingegeben und die UID wird ausgegeben...........username_uid\n" 
				  "  uid wird eingegeben und der username wird ausgegeben...........uid_username\n\n"
				  "  Eingabe:")
 	return option_suche

def suchauswahl():
	suchwert = raw_input ("Welcher STRING soll gesucht werden? ")	 
	return suchwert

def yppasswdauswertung(suchwert, option_suche):					# suchwert=STRING; option_suche=uid,username,etc.
	 # userID einem Benutzernamen zuordnen					# Benoetigte IMPORTS sind:
	 #									# "import subprocess"
	 #									# "from subprocess import PIPE, Popen"
	ypcatpasswdarray=[]							# leeres Array erstellen
	ypcatpasswdshell = Popen(["ypcat", "passwd"], stdout=PIPE)		# Ausgabe von "ypcat passwd" wird gepiped 
	output = ypcatpasswdshell.communicate()[0]				# Die "0" gibt stdout zurück (holt sich die Ausgabe der PIPE) 
										# Die "1" gibt stderr zurück
	 # print output
	 # Ausgabe von ypcat passwd wird in das Array geleitet
	for line in output:							# Nimmt den STRING "output" und leitet alles in das Array 
		a = line
		ypcatpasswdarray.append(a)
	
	 # Aus dem Array ypcatpasswdarray wird tmparray 			# Aus einzelnen Buchstaben wird ein Datensatz
	 # print tmparray[0] gibt einen einzelnen Datensatz aus			# Hier den ersten
	tmpstring=[]
	passwdzeile=''								#ein leerer string
	for einzelnerbuchstabe in ypcatpasswdarray:
	    if einzelnerbuchstabe == '\n':
	       passwdzeile=passwdzeile+einzelnerbuchstabe 			#zeilenstring zusammensetzen
	       tmpstring.append(passwdzeile)
	       passwdzeile='' 							#zeileninhalte  loeschen
	    else:
	       passwdzeile+=(einzelnerbuchstabe)
	
	 # Ausgabe eines einzelnen Wertes aus einem Datensatz
	username_maschinenname=[]
	userID_maschinenID=[]
	gruppenID=[]
	for line in tmpstring:
		words = line.split(':') 
		username_maschinenname.append(words[0])
	        userID_maschinenID.append(words[2])
		gruppenID.append(words[3])
	try:
	 if option_suche == "uid_username":
	  such_index = userID_maschinenID.index(suchwert)
	  return username_maschinenname[such_index]
	 if option_suche == "username_uid":
	  such_index = username_maschinenname.index(suchwert)
	  return userID_maschinenID[such_index]
	 if option_suche == "username":
	  such_index = username_maschinenname.index(suchwert)
	  return  username_maschinenname[such_index]
	 elif option_suche == "gid":
	  such_index = gruppenID.index(suchwert)
	  return gruppenID[such_index]
	 elif option_suche == "uid":
	  such_index =  userID_maschinenID.index(suchwert)
	  return userID_maschinenID[such_index]
	 else: 
	  print "OPTION_SUCHE war: ", option_suche
	  return "OPTION_SUCHE war nicht username, gid oder uid"
	except:
	 #print "Try User nicht vorhanden"
	 return "Abfrage nicht erfolgreich"

def logfile_auswerten():
	ergebnis = logfile_oeffnen_und_auswerten()
	for i, v in enumerate (ergebnis):
		print i, v
	return ergebnis


# HAUPTPROGRAMM
	# Benutzersuche 
print " "
print " "
print " "
print " "
#		Abfrage ueber ein Menue - zum testen der Funktion !!
#		 ergebnis_suche_option_auswahl = suche_option_auswahl()					# Was soll gesucht werden? (GID, UID, UserName)
#		 ergebnis_suchauswahl = suchauswahl()							# Welcher STRING aus GID, UID oder UserName soll gesucht werden?
#		 print yppasswdauswertung(ergebnis_suchauswahl, ergebnis_suche_option_auswahl)		# Aufruf der Funktion usersuche()
print logfile_oeffnen_und_auswerten()
#
#		 Beispiele fuer den Aufruf der Funktion yppasswdauswertung
#		     print yppasswdauswertung("1121","uid_username") ----> AUSGABE ist: heinz
#		     print yppasswdauswertung("frank","username_uid") ----> AUSGABE ist: 1011
# print logfile_auswerten()
krischeu
User
Beiträge: 40
Registriert: Freitag 9. Januar 2009, 17:04

Donnerstag 29. Januar 2009, 15:52

Problem erkannt, wird gleich gebannt.
folgender Aufruf wird für jeden Vergleich eines Strings aus der Sequenz aufgerufen. Das Problem ist wahrscheinlich der Aufruf des Popen ....
Muß ich einmal machen und dann immer wieder aufrufen ....

Code: Alles auswählen

def yppasswdauswertung(suchwert, option_suche):					# suchwert=STRING; option_suche=uid,username,etc.
	 # userID einem Benutzernamen zuordnen					# Benoetigte IMPORTS sind:
	 #									# "import subprocess"
	 #									# "from subprocess import PIPE, Popen"
	ypcatpasswdarray=[]							# leeres Array erstellen
	ypcatpasswdshell = Popen(["ypcat", "passwd"], stdout=PIPE)		# Ausgabe von "ypcat passwd" wird gepiped 
	output = ypcatpasswdshell.communicate()[0]			
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Donnerstag 29. Januar 2009, 16:46

Das was du da Array nennst ist übrigens eine Liste.
Antworten