Ich möchte alle Protokolle zwischen zwei Zeitstempeln extrahieren. Einige Zeilen haben möglicherweise nicht den Zeitstempel, aber ich möchte diese Zeilen auch. Kurz gesagt, ich möchte jede Zeile, die unter zwei Zeitstempel fällt. Meine Logstruktur sieht so 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
und extrahieren 2014-04-08 02:00
.
Bitte beachten Sie, dass der Start- oder Endzeitstempel möglicherweise nicht im Protokoll enthalten ist, ich jedoch jede Zeile zwischen diesen beiden Zeitstempeln verwenden möchte.
text-processing
sed
awk
grep
Amit
quelle
quelle
date -d
Befehl eingeben und damit das Suchmuster erstellen.Antworten:
Sie können dafür verwenden
awk
:Woher:
-F
legt die Zeichen fest[
und]
als Feldtrennzeichen mit einem regulären Ausdruck fest$0
referenziert eine komplette Zeile$2
verweist auf das Datumsfeldp
wird als boolesche Variable verwendet, die den tatsächlichen Druckvorgang überwacht$0 ~ /regex/
ist wahr, wenn Regex übereinstimmt$0
>=
wird zum lexikografischen Vergleichen von Strings verwendet (entspricht zBstrcmp()
)Variationen
Die obige Befehlszeile implementiert einen rechtsoffenen Zeitintervallabgleich . Um eine Semantik für geschlossene Intervalle zu erhalten, erhöhen Sie einfach Ihr rechtes Datum, zB:
Wenn Sie Zeitstempel in einem anderen Format abgleichen möchten, müssen Sie das ändern
$0 ~ /^\[/
Unterausdruck . Beachten Sie, dass es verwendet wird, um Zeilen ohne Zeitstempel aus der Druck-Ein / Aus-Logik zu ignorieren.Beispielsweise können Sie für ein Zeitstempelformat wie
YYYY-MM-DD HH24:MI:SS
(ohne[]
geschweifte Klammern) den Befehl folgendermaßen ändern:(Beachten Sie, dass auch das Feldtrennzeichen geändert wird - auf leer / nicht leer Übergang, die Standardeinstellung)
quelle
$1 ~ /^[0-9]{4}-[0-9]{2}-[0-9]{2}/ && $2 ~/[0-2][0-9]:[0-5][0-9]:[0-5][0-9]/ { Time = $1" "$2; if (Time >= "2014-04-07 23:00" ) { p=1 } if (Time >= "2014-04-08 02:00:01" ) { p=0 } } p
code
? Ich habe versucht, $ 0 ~ / ^ [az | AZ] {4} - [0-9] {2} - [0-9] {4} [0-2] [0-9 ]: [0-5] [0-9]: [0-5] [0-9] / && $ 1 "" $ 2> = "Apr-07-2014 11:00" {p = 1} $ 0 ~ / ^ [az | AZ] {4} - [0-9] {2} - [0-9] {4} [0-2] [0-9]: [0-5] [0-9]: [0 -5] [0-9] / && $ 1 "" $ 2> = "Apr-07-2014 12:00:01" {p = 0},code
aber es funktioniert nichtCheck out
dategrep
unter https://github.com/mdom/dategrepBeschreibung:
Anwendungsbeispiele:
Obwohl diese Einschränkung dies für Ihre genaue Frage möglicherweise ungeeignet macht:
quelle
Eine Alternative
awk
oder ein nicht standardmäßiges Tool ist die Verwendung von GNUgrep
für seine kontextbezogenen Greps. Mit GNUgrep
können Sie die Anzahl der Zeilen nach einer positiven Übereinstimmung, mit-A
der gedruckt werden soll, und die Anzahl der vorhergehenden Zeilen, mit denen gedruckt werden soll, angeben.-B
Beispiel:Die oben erzählt im Wesentlichen
grep
die 10.000 Zeilen zu drucken , die der Linie folgen , die das Muster übereinstimmt Sie wollen an beginnen, effektiv Ihre Ausgabe zu machen beginnen , wo Sie es und geht bis zum Ende (hoffentlich) , während der zweiten wollen , sindegrep
in der Die Pipeline weist sie an, nur die Zeile mit dem Endbegrenzer und den 10.000 Zeilen davor zu drucken. Das Endresultat dieser beiden beginnt dort, wo Sie wollen, und geht nicht dort vorbei, wo Sie es befohlen haben, damit aufzuhören.10.000 ist nur eine Zahl, die ich mir ausgedacht habe. Sie können sie jederzeit in eine Million ändern, wenn Sie der Meinung sind, dass Ihre Ausgabe zu lang sein wird.
quelle
sed
was auch nach wörtlichen Übereinstimmungen sucht.dategrep
ist wahrscheinlich die richtigste Antwort von allen gegebenen (da Sie in der Lage sein müssen, "unscharf" zu werden, welche Zeitstempel Sie akzeptieren), aber wie die Antwort sagt, habe ich es nur als Alternative erwähnt. Das heißt, wenn das Protokoll aktiv genug ist genug Ausgabe zu rechtfertigen generieren Schneiden es wahrscheinlich auch gehen , um haben einige für die gegebene Zeitfenster Art des Eintrages.Sed verwenden:
Kopieren Sie dies in eine Datei. Wenn Sie keine Debugging-Informationen sehen möchten, wird das Debugging an stderr gesendet. Fügen Sie einfach "2> / dev / null" hinzu.
quelle