ubuntuusers.de

Logfile Auswertung und awk

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

garfield168

Anmeldungsdatum:
21. Oktober 2006

Beiträge: Zähle...

Hallo,

ich muss Logfiles auswerten, wo eine Zeile ungefähr so aussieht:
INFO - 2007.12.10 at 22:58:37 Remote Host: x.x.x.x | Client to client: 1002ms | Network: 823ms | Event: save

ich weiß schon, dass man dass mit grep und awk machen kann aber ein paar Schwierigkeiten habe ich noch:

  • wie kann ich awk sagen, dass das Trennzeichen ein | ist? (mit awk '{print $2}' trennt er ja nach Leerzeichen)

    • der Text zwischen den Trennzeichen müsste auch nochmal gefiltert werden also aus "Client to client: 1002ms" mache 1002
      und jeweils die Zeit und das Datum (ich denke das kann man mit cut machen)

Alle logfiles sind in einem Verzeichnis und ich hole alle Zeilen mit Event: save
grep -E 'Event: save' /home/user1/Desktop/test/* | awk ...

Für Hilfen und Tipps wäre ich sehr dankbar

dusk

Avatar von dusk

Anmeldungsdatum:
29. Oktober 2007

Beiträge: 108

garfield168 hat geschrieben:

  • wie kann ich awk sagen, dass das Trennzeichen ein | ist? (mit awk '{print $2}' trennt er ja nach Leerzeichen)

Das geht mit

awk -F "|" '{print $2}'

Hier ist eine sehr schöne Anleitung zu awk, vielleicht hilft dir das auch noch weiter.

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

Wenn du nicht unbedingt schon sehr firm mit den tools bist würde ich dir da Perl empfehlen 😮
Damit geht das wesentlich einfacher.

garfield168

(Themenstarter)

Anmeldungsdatum:
21. Oktober 2006

Beiträge: 21

Vielen Dank schonmal für die Antworten!
Mit Perl habe ich auch schon gearbeitet. Ich überlege es mir mal.

MrDoubtfire

Anmeldungsdatum:
18. Oktober 2005

Beiträge: 210

Hallo garfield168,

ein möglicher Ansatz für Perl wäre folgendes:

#!/usr/bin/perl

use warnings;
use strict;

while (my $zeile = <DATA>) {
    my @spalten = split / \| /, $zeile;
    $spalten[0] =~ s/.*(\d{4}\.\d{2}\.\d{2}).*(\d{2}:\d{2}:\d{2}).*/$1 $2/;
    print "$spalten[0]\n";
    $spalten[1] =~ s/.*(\d{4}ms)\z/$1/;
    print "$spalten[1]\n";
    print "$spalten[2]\n";
    print "$spalten[3]\n";
}

__DATA__
INFO - 2007.12.10 at 22:58:37 Remote Host: x.x.x.x | Client to client: 1002ms | Network: 823ms | Event: save


Die Schleife musst Du halt entsprechend anpassen (entweder rekursiv über alle maßgeblichen Dateien oder mittels Diamantoperator [<>]).

MrDoubtfire

audax

Avatar von audax

Anmeldungsdatum:
15. September 2006

Beiträge: 1253

Bevor du dir da RegExp für Ip-Adressen und Uhrzeiten und so weiter zusammenbaust, nimm lieber
http://search.cpan.org/~abigail/Regexp-Common-2.120/lib/Regexp/Common.pm

Antworten |