GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie extrahiert man Protokolle zwischen zwei Zeitstempeln?

Ich möchte alle Protokolle zwischen zwei Zeitstempeln extrahieren. Einige Zeilen haben möglicherweise keinen Zeitstempel, aber ich möchte diese Zeilen auch. Kurz gesagt, ich möchte jede Zeile, die unter zwei Zeitstempel fällt. Meine Protokollstruktur sieht folgendermaßen aus:

[2014-04-07 23:59:58] CheckForCallAction [ERROR] Exception caught in +CheckForCallAction :: null
--Checking user--
Post
[2014-04-08 00:00:03] MobileAppRequestFilter [DEBUG] Action requested checkforcall

Angenommen, ich möchte alles zwischen 2014-04-07 23:00 extrahieren und 2014-04-08 02:00 .

Bitte beachten Sie, dass der Startzeitstempel oder Endzeitstempel möglicherweise nicht im Protokoll vorhanden ist, aber ich möchte jede Zeile zwischen diesen beiden Zeitstempeln.

Akzeptierte Antwort:

Sie können awk verwenden dazu:

$ awk -F'[]]|[[]' 
  '$0 ~ /^[/ && $2 >= "2014-04-07 23:00" { p=1 }
   $0 ~ /^[/ && $2 >= "2014-04-08 02:00" { p=0 }
                                        p { print $0 }' log

Wo:

  • -F gibt die Zeichen [ an und ] als Feldtrenner mit einem regulären Ausdruck
  • $0 verweist auf eine komplette Zeile
  • $2 verweist auf das Datumsfeld
  • p wird als boolesche Variable verwendet, die das eigentliche Drucken überwacht
  • $0 ~ /regex/ ist wahr, wenn Regex mit $0 übereinstimmt
  • >= wird zum lexikographischen Vergleich von Strings verwendet (entspricht z. B. strcmp() )

Variationen

Die obige Befehlszeile implementiert den rechtsoffenen Zeitintervallabgleich. Um die Semantik geschlossener Intervalle zu erhalten, erhöhen Sie einfach Ihr richtiges Datum, z. B.:

$ awk -F'[]]|[[]' 
  '$0 ~ /^[/ && $2 >= "2014-04-07 23:00"    { p=1 }
   $0 ~ /^[/ && $2 >= "2014-04-08 02:00:01" { p=0 }
                                           p { print $0 }' log

Falls Sie Zeitstempel in einem anderen Format abgleichen möchten, müssen Sie den $0 ~ /^[/ ändern Unterausdruck. Beachten Sie, dass Zeilen ohne Zeitstempel von der Druck-Ein/Aus-Logik früher ignoriert wurden.

Zum Beispiel für ein Zeitstempelformat wie YYYY-MM-DD HH24:MI:SS (ohne [] geschweiften Klammern) könnten Sie den Befehl wie folgt ändern:

$ awk 
  '$0 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-2][0-9]:[0-5][0-9]:[0-5][0-9]/
      {
        if ($1" "$2 >= "2014-04-07 23:00")     p=1;
        if ($1" "$2 >= "2014-04-08 02:00:01")  p=0;
      }
    p { print $0 }' log

(Beachten Sie, dass auch das Feldtrennzeichen geändert wird – zum Übergang zwischen Leerzeichen und Nicht-Leerzeichen, die Standardeinstellung)


Linux
  1. Wie wähle ich das erste Auftreten zwischen zwei Mustern aus, die sie enthalten?

  2. Wie extrahiert man Protokolle zwischen zwei Zeitstempeln?

  3. Wie synchronisiere ich Dateien zwischen zwei Fernbedienungen?

  4. Linux – Wie lösche ich Dateien, die zwischen zwei Mal erstellt wurden?

  5. Wie erstelle ich eine bidirektionale Pipe zwischen zwei Programmen?

So übertragen Sie Dateien zwischen zwei Computern mit den Befehlen nc und pv

So finden Sie den Unterschied zwischen zwei Verzeichnissen mit Diff- und Meld-Tools

So extrahieren (entpacken) Sie die Tar Gz-Datei

So extrahieren (entpacken) Sie die tar.xz-Datei

So synchronisieren Sie Dateien automatisch zwischen zwei Linux-Servern

So verbinden und teilen Sie Daten zwischen zwei Linux-Systemen