Logdatei auswerten und neue Logdatei erstellen => Nur bei bestimmtem Wert

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von Cardo, 01.08.2006.

  1. Cardo

    Cardo Mitglied

    Dabei seit:
    01.08.2006
    Beiträge:
    32
    Zustimmungen:
    0
    Hi Leute,

    ich bin gerade dabei ein Shell-Script zu schreiben um Logdateien auszuwerten und das Ergebnis in eine neue Datei zu schreiben.

    Beispiel Logdatei:
    name (001547) = Tux
    nachnahme (001547) = Pinguin
    anzahl (001547) = 215
    name (001548) = Tux2
    nachnahme (001548) = Pinguin2
    anzahl (001548) = 1.215
    name (001549) = Tux3
    nachnahme (001548) = Pinguin3
    anzahl (001549) = 5

    ./logauswertung logdateiname

    #!/bin/bash
    ## Name des Scripts logauswertung

    for line in $1;
    do
    awk '{print 2$, 3$, 4$}' $1
    done

    Bisher funktioniert auch alles.

    Allerdings möchte ich, dass wenn die 'Anzahl' einen bestimmten Wert überschreitet, der Wert in eine neue Logdatei geschrieben wird.
    Es soll quasi alles herausgefiltert werden, das unter Anzahl $2 (z.B. 500) ist.

    Hat jemand ne Idee oder ein Code-Beispiel, wie ich das machen könnte?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Wolfgang, 01.08.2006
    Zuletzt bearbeitet: 01.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo,
    ungetestetes Beispiel ohne awk mit read

    Code:
    FILE=1;
    while read A NUM Z Wert;
     do 
    #Klammern entfernen
    F=$(echo $NUM|tr -d "()");
    #wenn größer 001548 in neue Datei umleiten
    if [ $F -gt 001548 ]; 
     then echo $A $F $Wert >>file_$((FILE+=1)).txt;
    else
     echo $A $F $Wert >>file_${FILE}.txt;
     fi;
    done< /tmp/test
    
    Gruß Wolfgang
    EDIT Bitte mach bei solchen Klammerwerten beim Posten den Haken an Grafische Smileys deaktivieren
     
  4. Cardo

    Cardo Mitglied

    Dabei seit:
    01.08.2006
    Beiträge:
    32
    Zustimmungen:
    0
    Danke für die Schnelle Antwort.

    Allerdings würd ich das ganze gern nach der Anzahl auswerten. (Den markierten)

    Code:
    Beispiel Logdatei:
    name (001547) = Tux
    nachnahme (001547) = Pinguin
    anzahl (001547) = [B]215[/B]
    name (001548) = Tux2
    nachnahme (001548) = Pinguin2
    anzahl (001548) = [B]1.215[/B]
    name (001549) = Tux3
    nachnahme (001548) = Pinguin3
    anzahl (001549) = [B]5[/B]
    
    Edit: Sry wegen den Smilies. Wird nicht wieder vorkommen :)

    Kann man bei meinem Script-Entwurf nicht einfach sowas reinbauen?

    Code:
    awk '{print 2$, 3$, 4$>1000}' $1
    Und noch ne Frage:
    Hat es einen speziellen Grund, warum du kein AWK benutzt hast in dem Script?
     
  5. hwj

    hwj Doppel-As

    Dabei seit:
    23.06.2006
    Beiträge:
    131
    Zustimmungen:
    0
    Ort:
    Bei Buxtehude
    Nun, Dein Beispiel startet für jetzt Zeile einen awk-Prozess. Wenn Deine Datei 1000 Zeilen hat, wird awk auch 1000x gestartet. Wolfgang macht alles direkt in der Shell - das dürfte auch locker um den Faktor 50-100 schneller sein :-)

    Wenn Du nur die Zeilen mit "anzahl" nehmen möchtest, kannst Du vorher ja noch ein if [ $A = "anzahl" ]; then einbauen, und hinterher ein "fi".

    Heiko
     
  6. #5 Wolfgang, 01.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Das rot markierte wird nicht gehen. Erst $, dann die Feldnummer ;)

    Wenn du schon awk haben willst, dann ist die for in Geschichte nicht nötig.
    Bin zwar kein Freund von awk, (da nehm ich immer Perl ;) ) aber folgendes sollte vom Prinzip her gehen.
    Code:
    awk 'BEGIN{Datei1="Name1";Datei2="Name2"}{if ( $4 <= 20 ){print $2 $3 $4 >Datei1}else {print $2 $3 $4 >Datei2}}' testfile
    
    Musst nur die Namen und den Wert (hier 20 ) anpassen
    Dazu wurde schon etwas gesagt.
    Deine for i in Schleife ist absolut unnütz, da awk ja ohnehin die Datei liest.
    Wenn in $1 der Dateiname steht, kannst du den auch an awk verfüttern.
    awk '<CODE>' $1

    Das mit den Smilies war nicht bös gemeint, sondern nur ein Hinweis damit der Code nicht zerstört wird. Manche wissen nicht wie das abzustellen ist.
    Erleichtert allen die Lesbarkeit. ;)

    Gruß Wolfgang
     
  7. Cardo

    Cardo Mitglied

    Dabei seit:
    01.08.2006
    Beiträge:
    32
    Zustimmungen:
    0
    Stimmt, ist klar, dass die Version schneller gehen würde.

    Öhm nun... Also das mit der Anzahl hab ich doch anders gemeint.

    name (001547) = Tux
    nachnahme (001547) = Pinguin
    anzahl (001547) = 215

    Das Soll nicht nach der in den Klammern stehenden Zahl ausgewertet werden, sondern nach der markierten Zahl.

    Geht sowas auch mit dem Skript von Wolfang oder wäre dafür awk (evtl. zusammen mit sed) besser geeignet?
     
  8. framp

    framp Mitglied

    Dabei seit:
    13.07.2006
    Beiträge:
    27
    Zustimmungen:
    0
    Wenn Du
    Code:
    cat $1 | awk '{print$2, $3, $4}' 
    benutzt wird nicht jedes Mal ein awk Thread gestartet sondern awk behandelt die Datei von vorne bis hinten. Und dann kannst Du da nach Belieben diverse awk Logik unterbringen.
    z.B.
    Code:
    cat $1 | awk '{if ( $2 > 4711) { next} print$2, $3, $4}' 
     
  9. #8 Wolfgang, 01.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Wozu hier cat?
    Das ist exat das Gleiche, und spart einen Prozess, löst aber nicht das Problem von Cardo.
    useless use of cat ;)
    Genau das macht mein Vorschlag.
    Hast du den mal getestet?
    Natürlich gehe ich davon aus, dass nur in Zeilen mit "anzahl" eine Zahl in $4 folgt.
    Aber auch das lässt sich komplettieren:
    Code:
    awk 'BEGIN{Datei1="Name1";Datei2="Name2"}{if ( /anzahl/ && $4 <= 20 ){print $2 $3 $4 >Datei1}else {print $2 $3 $4 >Datei2}}' test
    
    Hier teste ich, ob "anzahl" vorkommt und das vierte Feld - also die Zahl hinter dem = - größer 20 iist.
    awk ist hier geeignet, da die Shell von sich aus nur mit integer rechnet, und so ein weiterer Prozess wie etwa bc notwendig würde.
    awk kann aber selbst mit float umgehen.

    Gruß Wolfgang
     
  10. Cardo

    Cardo Mitglied

    Dabei seit:
    01.08.2006
    Beiträge:
    32
    Zustimmungen:
    0
    Also ich hab Wolfgangs Script mal getestet

    Code:
    awk 'BEGIN{Datei1="Name1";Datei2="Name2"}{if ( /anzahl/ && $4 <= 20 ){print $2 $3 $4 >Datei1}else {print $2 $3 $4 >Datei2}}' test
    Das ganze Funktioniert an sich ganz gut, aber es gibt da noch ein paar kleine Probleme:

    Also die Datei1 brauch ich gar nicht. Ich hab jetzt einfach mal am ende vom Skript ein "rm Name1" eingebaut. Kann man Problem das "schöner" lösen?

    Nächstes Problem:
    In der Datei2 stehen dann auch die Strings also die Buchstaben drin. Die Filtert das Script bei dem >Zahl leider nicht heraus.

    Code:
    Beispiel Logdatei:
    name (001547) = Tux
    nachnahme (001547) = Pinguin
    anzahl (001547) = 215
    name (001548) = Tux2
    nachnahme (001548) = Pinguin2
    name (001549) = Tux3
    nachnahme (001548) = Pinguin3
    Da aller guten in drei sind gibts auch noch ein drittes Problem:
    Die Werte, die bei Anzahl über 999 stehen, werden dann alle mit einem Punkt getrennt. Zum Beispiel 1.434. Muss man den Punkt vorher rausfiltern oder kann man einfach noch eine Bedingung einbauen?
    ______________________________________________________________
    Und danke an alle, die hier so toll helfen. Das hier scheint ein Super Forum zu sein. Mit hohem Niveau :))
     
  11. #10 Wolfgang, 02.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Dann leg sie einfach nicht an. ;)
    Wenn du nur bestimmte Daten in einer Datei haben willst, dann kannst du die direkt ausfiltern und ausserhalb des Scriptes umleiten:
    awk '{<FILTERSCRIPT>}' Input >Output

    Dann erklär dein Problem bitte genauer.
    Welche Daten willst du nach welchem Kriterium in welcher Datei speichern?
    Schreib einfach mal wie das Ergebnis bei deinem Beispiel aussehen soll.
    Du hast es selbst in der Hand welches Feld du ausgeben willst.
    Einen Blick in die Manpage von awk wird dir nicht erspart bleiben. ;)


    Ich bin davon ausgegangen, dass die Werte mit dem Punkt Gleitkommazahlen sind.
    Wenn dem nicht so ist, musst du diesen vor der Auswertung natürlich entfernen.
    Code:
    $ echo "anzahl (00014789) = 1.200"|awk '{ if (/anzahl/){gsub ("\.","",$4)} if ($4 gt 999 ){print $4}}'
    1200
    
    gsub entfernt hier den Punkt aus dem vierten Feld, wenn die Zeile "anfang" enthält. Danach kannst du damit alle numerischen Vergleiche durchführen.

    Fazit:
    Formuliere nochmal genau an Hand der Daten was dene Aufgabe ist.
    Wie die Daten aussehen, wissen wir, aber wie das Ergebnis genau aussehen soll nicht.

    Gruß Wolfgang
     
  12. Cardo

    Cardo Mitglied

    Dabei seit:
    01.08.2006
    Beiträge:
    32
    Zustimmungen:
    0
    Hier mal die Beispiel logfile und wie die neue Datei nach der bearbeitung aussehen soll:

    Code:
    #Logdatei original
    
    name (001547) = Tux
    nachnahme (001547) = Pinguin
    anzahl (001547) = 215
    name (001548) = Tux2
    nachnahme (001548) = Pinguin2
    anzahl (001548) = 1.215
    name (001549) = Tux3
    nachnahme (001548) = Pinguin3
    anzahl (001549) = 5
    Code:
    Gewünschtes Ergebnis nach Scriptdurchlauf:
    #Wenn bei Anzahl >200 eingestellt wäre.
    anzahl (001547) = 215
    anzahl (001548) = 1.215
    
     
  13. #12 Wolfgang, 02.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Na dann ist doch schon fast alles da was du suchst da. ;)
    Code:
    
    $ awk '/anzahl/{gsub ("\.","",$4); if(($4+0)>200){print}}' test
    anzahl (001547) = 215
    anzahl (001548) = 1215
    
    • Bearbeite nur Zeilen die anzahl enthalten -> /anzahl/
    • Entferne im vierten Feld den Punkt -> gsub("\.","",$4)
    • Addiere zu $4 0 hinzu und vergleiche das Ergebnis mit 200 , wenn wahr printe Zeile aus.

    Der Trick $4+0 zwingt awk zum numerischen Vergleich.
    Da wir auf dieser Variablen schon mit gsub gearbeitet haben, wird $4 als String vorgemerkt. Eine Addition mit 0 erzwingt diesen Wert wieder numerisch.
    Siehe manpage von awk. :rtfm:

    Wenn du die Ausgabe in eine Datei umleiten willst einfach :
    Code:
    $ awk '/anzahl/{gsub ("\.","",$4); if(($4+0)>200){print}}' test >Ausgabedatei
    
    Gruß Wolfgang
     
  14. Cardo

    Cardo Mitglied

    Dabei seit:
    01.08.2006
    Beiträge:
    32
    Zustimmungen:
    0
    Wow, jetzt hab ich fast das gewünschte Ergebnis.

    Allerdings bekomm ich bei dem code

    Code:
    awk '/anzahl/{gsub ("\.","",$4); if(($4+0)>200){print}}' testlog >Ausgabedatei
    folgende Fehlermeldung:

    awk: cmd. line:1: warning: escape sequence `\.' treated as plain `.'
    Die Ausgabedatei wird dann zwar geschrieben, es steht aber nichts drin.

    Also hab ich obem beim gesub einfach ein Leerzeichen gemacht ("\ .","",$4).
    Es kommt zwar immer noch die Fehlermeldung (aber ohne Punkt), jedoch wird das richtige Ergebis in die Datei geschrieben.

    Woran könnte das liegen?
     
  15. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  16. #14 Wolfgang, 02.08.2006
    Zuletzt bearbeitet: 02.08.2006
    Wolfgang

    Wolfgang Foren Gott

    Dabei seit:
    24.04.2005
    Beiträge:
    3.978
    Zustimmungen:
    0
    Ort:
    Erfurt
    Hallo

    Welche Shell benutzt du denn?
    Welches OS?

    Bei mir unter bash geht folgendes:
    Der Punkt muss geschützt werden, da er ein Metazeichen für awk darstellt.
    Was du genacht hast, ist ein leerzeichen zu escapen, was natürlich nicht sinnvoll ist.
    Wenn bei dir das Ergebnis auch ohne \. stimmt, dann kannst du auch folgendes nutzen:
    Portabler könnte aber das hier sein:
    Gruß Wolfgang
     
  17. #15 Cardo, 03.08.2006
    Zuletzt bearbeitet: 05.08.2006
    Cardo

    Cardo Mitglied

    Dabei seit:
    01.08.2006
    Beiträge:
    32
    Zustimmungen:
    0
    Morgen Wolfgang,

    also ich nutze United Linux und die Bash.


    Die Version funktioniert Super:
    Code:
    $ awk '/anzahl/{gsub ("[.]","",$4); if(($4+0)>200){print}}' test
    EDIT:
    Ich hab einfach zwei ' bei $anzahl gesetzt. Geht jetzt ^^

    Also, jetzt möchte ich nur noch was einbauen, wenn keine Anzahl gesetzt wurde...
    Ich habs mal wie folgt probiert:

    Code:
    #!/bin/bash
    anzahl=$2
    if test $2 -eq ' '
    then
    anzahl='200'
    awk '/anzahl/{gsub ("[.]","",$4); if(($4+0)>'$anzahl'){print}}' $1 > auswertung
    
    Das Funktioniert bei mir leider nicht.
    Hat jemand ne Idee, wie ich das Problem lösen könnte?
    Also es soll überprüft werden, ob nichts als $2 angeben wurde. Wenn das der Fall ist, soll die Variable anzahl auf 200 gesetzt werden.

    EDIT:

    Ich hab das ganze jetzt einfach so gelöst:

    Code:
    #!/bin/bash
    anzahl=$2
    if test $2 -eq 0
    then
    anzahl='200'
    awk '/anzahl/{gsub ("[.]","",$4); if(($4+0)>'$anzahl'){print}}' $1 > auswertung
    
    Also wenn man als Wert
    ./script.sh Dateiname 0
    eingibt, wird 200 als Standart wert genommen.

    Jetzt aber noch mal ein großes Special THX an Wolfgang und alle anderen die geholfen haben!
     
Thema:

Logdatei auswerten und neue Logdatei erstellen => Nur bei bestimmtem Wert

Die Seite wird geladen...

Logdatei auswerten und neue Logdatei erstellen => Nur bei bestimmtem Wert - Ähnliche Themen

  1. Reaktion auf ein Stichwort in Logdatei

    Reaktion auf ein Stichwort in Logdatei: Hi, ich möchte ne Logdatei auswerten. Die Funktion soll nur einmal nach dem Booten genutzt werden. Wenn "Tue-Das" im Logfile vorkommt start das...
  2. bitte um hilfe bei: Logdatei mit "sed" anpassen

    bitte um hilfe bei: Logdatei mit "sed" anpassen: Hallo zusammen, ich möchte gerne in eine vorhandene Logdatei mit nachfolgendem code anpassen. echo " Bitte nun Hostnamen des Servers...
  3. Umgang mit Logdateien

    Umgang mit Logdateien: Hallo, ich bin gerade dabei X-Server-Hänger unter ubuntu 11.04 aufzuspüren und so habe ich folgende Zeile in rsyslog.conf geschrieben:...
  4. Schreiben eine LogDatei!!!

    Schreiben eine LogDatei!!!: Hallo, ich habe folgendes Problem. Ich benötige für mein Projekt eine log Datei. In der ich alle möglichen Teilschritte meines Programmes...
  5. Probleme mit tar-Logdatei

    Probleme mit tar-Logdatei: hi @ all! ich habe in einem backup-script angegeben, dass er mir zwei verschiedene Logdateien erstellen soll. eine heißt...