python anfänger - logfile auswerten
@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.
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.
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]
Lies die Doku zum subprocess-Modul und vergiss am besten, dass es os.system() überhaupt gibt.
-
- User
- Beiträge: 221
- Registriert: Sonntag 1. Juni 2008, 09:08
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
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.
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!)
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]
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]
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]
Das ist jetzt aber Grundlagenwissen. Es sollte eigentlich klar sein, dass du die entsprechenden Attribute vorher aus "subprocess" importieren muss.
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
@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.
Mit 2.6 und dem with-Statement ist das aber für den meisten Code ein alter Hut.
Schreib mal lieberkrischeu hat geschrieben:das hab ich dann mal ausprobiert, weil es meinem Wunsch am naechsten kam. (import subprocess oben reingeschrieben!)
Code: Alles auswählen
from subprocess import PIPE, Popen
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:
Gibt es da was eleganteres?
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)
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
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: heinz1121:10101:Heinz Krischeu:/net/home/heinz:/bin/bash
TESTTEMP heinz1121: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]
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: heinz1121:10101:Heinz Krischeu:/net/home/heinz:/bin/bash
TESTTEMP heinz1121: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]
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
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.
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.
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.
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
Code: Alles auswählen
'1'.isdigit()
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.
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.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Davon mal angesehen, dass niemand gesagt hat, du solltest auf Python 3.0 aktualisieren...
Ubuntu 8.10 ist auch kein LTS-Release. Und Python 2.6 gibt es bischer in keiner Ubuntu-Version.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.
Hallo,
.isdigit gibt es auch bei mit - Python 2.5.2
Wenn ich es direkt in der Python-"Shell" ausführe funktioniert das auch.
Hier mein codesnippet:
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?
.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()
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?
Suuuper,
daaanke.
Hier die Lösung:
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