LOG auswertung in Shell | Addieren mit awk bei bestimmter Bedingung

Dieses Thema im Forum "Shell-Skripte" wurde erstellt von GreenCream, 29.10.2008.

  1. #1 GreenCream, 29.10.2008
    Zuletzt bearbeitet: 29.10.2008
    GreenCream

    GreenCream Grünschnabel

    Dabei seit:
    29.10.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Hallo Leute,

    ich bin relativ neu in der Shell und in der Linux-Welt überhaupt.

    Jetzt versuche ich gerade ein Script zu schreiben dass mir die Größe eines Backups aus einem Logfile ausliest (um es per snmp abfragen zu können).

    Es geht dabei um eine einzige Datei (pro Tag) in der Die Größe und die Art des Backups von ca 30 Rechnern aufgezeichnet wird.

    Es gibt für jeden Rechner eine Zeile in der die Größe des Backups steht, und eine Zeile in der Steht was für eine Art von Backup (Full/Incremental) es war. (Ausnahme ist ein Rechner (im Beispiel Rechnerx) für den es nur die Zeile mit der Größe gibt, hier ist es immer ein Full Backup.)

    Es kann (an einem Tag) Rechner geben die sowohl ein Full als auch ein Incremental Backup gemacht haben.

    So sieht das ganze aus:
    Code:
    28.10.2008 Linux backupserver1
    Rechner1: Bytes written to media:        182744
    Rechner4: Bytes written to media:        52070587
    Rechner6: Bytes written to media:        66581055
    Rechner2: Bytes written to media:        30104
    ...
    Rechner4: Incremental backup finished.
    Rechner6: Incremental backup finished.
    Rechner2: Incremental backup finished.
    Rechner1: Incremental backup finished.
    ...
    28.10.2008 Linux Backupserver
    Rechnerx: Bytes written to media:        30104
    Rechner4: Bytes written to media:        52070587
    Rechner6: Bytes written to media:        66581055
    ...
    Rechner6: Full backup finished.
    Rechner2: Full backup finished.
    Rechner4: Full backup finished.
    ...
    
    Das Ziel ist das script mit dem Parameter "Full" oder "Incremental" aufzurufen und die Summe der geschriebenen Bytes zurückzubekommen.

    Ich plage mich jetzt schon ein paar Tage dran und habe schon ne ganze Menge ausprobiert, bin nur nie wirklich weitergekommen. (Auser dass ich schon ein bisschen mehr über shell gelernt habe)

    Mein letzter Versuch ging in die Richtung die beiden Zeilen die zu einem Rechner gehören in eine Zeile zu schreiben, dann 2 Dateien draus zu machen, und anschließend mit awk beide Dateien einzeln auszuwerten.

    Code:
    sort $sizefile | sed ':;s/finished./  finised.EOL/;N;T' | sed ':;s/\n/ /;N;T' | sed ':;s/EOL/  \n/g;N;T'  >> tempfile1
    
    grep 'full' tempfile1 > tempfile2
    grep 'Incremental' tempfile1 > tempfile3
    
    groese1=$(less tempfile2 | awk '/written/ | $1  {summe += $6} END { printf ("%d",summe)}')
    
    groese2=$(less tempfile3 | awk '/written/ | $1  {summe += $6} END { printf ("%d",summe)}')
    
    Aber funktionieren tut es genauso wenig.

    Ich verwende die sh shell, bash oder tcsh würden auch gehen, wenn es damit einfacher wäre. Pearl nur wenn es sich wirklich nicht vermeiden lässt.

    Vieleicht habt ihr ja noch eine ganz andere Idee wie ich sowas anfangen könnte.

    Gruß
    Benjamin


    Edit:
    Infos zum System:
    openSUSE 10.2 (i586)
    VERSION = 10.2
    Linux version 2.6.18.2-34-default (geeko@buildhost) (gcc version 4.1.2 20061115 (prerelease) (SUSE Linux)) #1 SMP Mon Nov 27 11:46:27 UTC 2006
     
  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. keks

    keks nicht 1337 genug

    Dabei seit:
    17.01.2007
    Beiträge:
    401
    Zustimmungen:
    0
    Ort:
    Hessen
    Kann nicht das Backupscript geändert werden, damit auch der Typ des Backups in der gleichen Zeile steht wie die anzahlt der kopierten Bytes??
    Also:

    Code:
    Rechner1: Bytes Incremental written to media:        182744  # oder so in der Art
    Dann währe das kein Problem!
     
  4. #3 GreenCream, 29.10.2008
    GreenCream

    GreenCream Grünschnabel

    Dabei seit:
    29.10.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Die Daten in diesem File Sammel ich ebenfalls per Grep aus tempfiles die das Backup wärend des backups anlegt und auch wieder löscht.
    Auf die Erstellung dieser tempfiles habe ich nur wenig Einfluss, und möchte am eigentlichen Backupsystem auch nichts verändern.
     
  5. #4 bytepool, 29.10.2008
    Zuletzt bearbeitet: 29.10.2008
    bytepool

    bytepool Code Monkey

    Dabei seit:
    12.07.2003
    Beiträge:
    791
    Zustimmungen:
    0
    Ort:
    /home/sweden/göteborg
    Hi,

    also von awk habe ich keine Ahnung (werde ich auch nie haben ;)), aber wenn du die Dateien eh schon sauber aufgetrennt hast sollte sich das z.B. mit cut machen lassen.
    Hier mal ein Beispiel, wobei in written.tmp die Information steht, wieviel bytes geschrieben wurden, und in inc.tmp stehen dann die Rechner fuer die inkrementellen backups.
    Im Beispiel wird davon ausgegangen, dass anhand der Doppelpunkte getrennt wird. Siehe "man cut".

    Code:
    #!/bin/bash
    
    sum=0
    
    while read line; do
        # extrahiere den Computernamen "comp"
        comp=$(echo $line | cut -d":" -f 1)
    
        # extrahiere die Anzahl der geschriebenen bytes fuer computer "comp"
        bytes=$(grep $comp written.tmp | cut -d":" -f 3)
    
        # fuege die bytes zur Summe hinzu.
        ((sum += bytes))
    done < inc.tmp
    
    echo "Sum: $sum"
    
    Edit: Habe nochmal ein paar comments in den code gepackt.

    mfg,
    bytepool
     
  6. #5 floyd62, 29.10.2008
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Hi,

    mir ist nicht ganz klar, wie das Ergebnis aussehen soll: willst du einfach die Gesamtgrösse aller Backups pro Rechner auflisten? Das ginge mit awk relativ einfach etwa so:

    Code:
    awk '
            /written/       { size[$1] += $6; seen[$1]++; type[$1] = "Full"; }
            /finished/      { type[$1] = $2; }
            END             { for (comp in seen) { print comp, size[comp], "(", type[comp], ")"; }; }
    ' <logfile
    
    Wenn du allerdings z.B. die Incrementals pro Rechner aufaddieren, und sowohl Full als auch Incremental Backups separat auflisten willst, müsste man bei der Verarbeitung der "finished"-Zeilen ein bisschen mehr Aufwand betreiben (die bisher gefundenen Daten für den aktuellen Rechner ausgeben und dann auf 0 zurücksetzen etc.), und im END-Abschnitt sicherstellen, dass man auch die Backups noch ausgibt, für die kein "finished"-Eintrag im Log steht ...
     
  7. #6 GreenCream, 30.10.2008
    GreenCream

    GreenCream Grünschnabel

    Dabei seit:
    29.10.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Sorry, hab ich glaube ich wirklich nicht verständlich genug erklärt.

    Es sollen 2 Summen ausgegeben werden:
    1. Die Größe aller Incremntal Backups auf allen Rechnen an diesem Tag
    2. Die Größe aller Full Backups auf allen Rechnen an diesem Tag

    Ein Tag = eine Datei

    Zur Erklärung:
    Es wird in dem script immer nur eine Datei ausgewertet alles andere folgt hinterher. Das ganze wird per snmp aufgerufen und in cacti als "chart" dargestellt. Daran soll mann dann erkennen wie sich das Backup entwickelt.

    @bytepool: Dein Ansatz sieht (so wie ich ihn verstanden habe) gut aus. Ich werde im laufe des Tages damit mal rumprobieren.
     
  8. #7 GreenCream, 03.11.2008
    GreenCream

    GreenCream Grünschnabel

    Dabei seit:
    29.10.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Ich binn leider damit auch nicht weitergekommen,
    langsam geht mir die shell-scripterei echt auf die nerven.

    Wie sollte das den erst sein wenn mann richtig aufwändiges macht...
     
  9. NoXqs

    NoXqs Routinier

    Dabei seit:
    07.05.2007
    Beiträge:
    420
    Zustimmungen:
    0
    Ort:
    Bremen
    Wie weit bist du denn gekommen??
    Was funktioniert nicht, was geht schonmal?

    Dann lass es doch einfach......

    Für jedes Problem gibt es ein mehr oder weniger geeignetes Werkzeug, um es zu lösen.
    Du nimmst sicherlich auch eine Zange um einen Nagel in die Wand zu hauen?!
     
  10. #9 GreenCream, 03.11.2008
    GreenCream

    GreenCream Grünschnabel

    Dabei seit:
    29.10.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Hast ja recht,
    vermutlich isses sogar alles ganz logisch und einfach; wenn manns erstmal kann *g*

    Aber wenn mal wieder nix geht wie es soll fällt halt dir motivation!


    Mommentan versuche ich es etwa so:

    Code:
    sort 03112008 | sed ':;s/finished./  finised.EOL/g;N;T' | sed ':;s/\n/ /;N;T' | sed ':;s/EOL/  \n/g;N;T'  >> tempfile1
    #Sortieren, einen String ans Ende jeder Zeile "finished" Zeile, Zeilenumbrüche Raus, String wieder durch Zeilenumbrüche ersetzen.
    # Das Einfügen Klappt troz /g nur nur in der ersten Zeile
    
    grep "$1" tempfile1 | awk '/written/ | $1  {summe += $6} END { printf ("%d",summe)}')
    #Aufspalten für entweder nur Incremental oder Full | Aufadieren der Anzahl der geschriebenen Bytes (Ich denke Spalte 6) aus dem tempfile2
    # Meldet "syntax error near unexpected token `)'"
    
    Ich weiß binn aber nicht sicher ob das überhaupt zum Ziel führt.
     
  11. NoXqs

    NoXqs Routinier

    Dabei seit:
    07.05.2007
    Beiträge:
    420
    Zustimmungen:
    0
    Ort:
    Bremen
    Kenn ich. :-)





    Zum Problem:

    Inhaltlich habe ich mich (noch) nicht damit beschäftigt, aber es liegt ein Syntaxfehler vor.

    Die runde Klammer am Ende wird nirgendwo geöffnet, oder?
     
  12. #11 GreenCream, 03.11.2008
    GreenCream

    GreenCream Grünschnabel

    Dabei seit:
    29.10.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Richtig, da hab ich wirklich ned aufgepasst, jetzt bekomme ich wieder den Fehler den ich vorher schon hatte:
    awk: ^ syntax error
    awk liest doch aus der Pipe, oder?
     
  13. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  14. #12 floyd62, 03.11.2008
    floyd62

    floyd62 Routinier

    Dabei seit:
    01.05.2007
    Beiträge:
    309
    Zustimmungen:
    0
    Klar, awk kann aus einer Pipe lesen. Aber was willst du mit dem Konstrukt
    Code:
    /written/ | $1
    
    in deinem awk-Pattern genau filtern? Das sieht mir nämlich nach deinem Syntax error aus :-) ...

    Ich hab mal mit awk ein bisschen weitergespielt:
    Code:
    awk '
            /written/       {
                                    seen[$1]++;                     # Computername merken
                                    size[$1] += $6;                 # Summe pro Backup/Computer
                            }
            /finished/      {
                                    total[$2] += size[$1];          # jetzt ist klar - full oder incremental
                                                                    # also entsprechend erfassen, dann
                                    size[$1] = 0;                   # zurücksetzen, damit wir nicht doppelt zählen
                            }
            END             {
                                                                    # Die Backups, für die keine "finished" lines
                                                                    # gefunden wurden, werden als Full gezählt
                                    for (comp in seen) {
                                            if (size[comp] > 0) {
                                                    total["Full"] += size[comp];
                                            }
                                    };
    
                                    print "Total Full Backups: ", total["Full"];
                                    print "Total Incrementals: ", total["Incremental"];
                            }
    '
    
    Vorteil bei diesem Ansatz ist, dass du dein Logfile in einem Durchlauf verarbeiten kannst, und nicht für jeden Rechner wieder von vorne (grep ...) anfängst.
     
  15. #13 GreenCream, 03.11.2008
    GreenCream

    GreenCream Grünschnabel

    Dabei seit:
    29.10.2008
    Beiträge:
    8
    Zustimmungen:
    0
    Danke für die Hilfe!

    Wow, funktioniert auf Anhieb!

    Ich weiß zwar (noch) nicht genau was dein awk-Konstrukt da macht :think:, aber es ist genau das was ich wollte :]

    Nachdem es ja jetzt tut wird mir das awk-Manual sicher auch im Detail erklären was da vor sich geht.

    Danke an alle
    Gruß
    Benjamin
     
Thema:

LOG auswertung in Shell | Addieren mit awk bei bestimmter Bedingung

Die Seite wird geladen...

LOG auswertung in Shell | Addieren mit awk bei bestimmter Bedingung - Ähnliche Themen

  1. smartmontools Testauswertung

    smartmontools Testauswertung: Hallo zusammen, ich habe einen neuen Server mit CentOS 5 am laufen. Jetzt habe ich mal die Platte überprüft. Ergebnis bei smartctl -A...
  2. Auswertung einer Datei

    Auswertung einer Datei: Hallo Leute, ich habe hier ein wahrscheinlich sehr einfach zu lösendes Problem. Und zwar habe ich eine Datei vor mir die aus knapp 40 Zeilen...
  3. Statistik/Auswertung aus MySQL-Datenbank

    Statistik/Auswertung aus MySQL-Datenbank: Hi, Ich habe hier eine Datenbank, in die die Ergebnisse eines Umfragetools geschrieben werden. Es ist im Prinzip eine Tabelle in der jeder...
  4. Welches Mailsystem/-Tool für Auswertung

    Welches Mailsystem/-Tool für Auswertung: :think: Moin Moin, zwischen meinem Server (ist ein Domino-Server) und dem Provider möchte ich ein Mailsystem/-Tool zwischenschalten, um den...
  5. Postfix Logauswertung für Statistik

    Postfix Logauswertung für Statistik: Hi Profis, ich möchte zwischen einen Domino-Server und Provider Postfix installieren, damit ich den SMTP-Traffic auswerten kann - also als...