Es wurde versucht, bestimmte Zeiten von Protokollen basierend auf der Empfehlung von auszudrucken diese Thread von Superuser. Ich bin mir nicht sicher, warum meine Muster nicht mit sed übereinstimmen. Ich habe das Beispieldatum und die Uhrzeit, die ich verwende, eingefügt Hier . Wenn ich benutze
sed -n '/2014-03-27 07:00:00/ , /2014-03-27 11:25:00/p' log-file-name
Ich erwarte, dass es alle Zeilen druckt, die zwischen 7.00 und 11.00 Uhr übereinstimmen. Aber ich bekomme keine Treffer. Wenn ich "-n" entferne, werden als Ergebnis die gesamten Zeilen von 3 Uhr morgens bis 16:14 Uhr gedruckt. Ich habe versucht, den obigen sed-Befehl mit einfachen und doppelten Anführungszeichen zu optimieren und habe verschiedene Abstandsoptionen ausprobiert. Aber die Ergebnisse sind immer "alle oder keine". Kann jemand bitte erklären, warum sed die Zeilen für das Stundenfenster nicht druckt, um das ich es bitte zu drucken?
Antworten:
Sie versuchen, sed mit der Funktion zum Starten und Stoppen von Mustern zu verwenden.
Wenn also eine Zeile gefunden wird, die Ihrem ersten (Start-) Muster entspricht, wird die Ausgabe solange zurückgegeben, bis eine Zeile gefunden wird, die dem zweiten (Stopp-) Muster entspricht.
Wenn die Startzeile in Ihrer Datei nicht genau vorhanden ist, erhalten Sie keine Ergebnisse.
Wenn Sie die Option -n aus Ihren Optionen entfernen, werden alle gedruckt, auch wenn sie nicht mit Ihrem Muster übereinstimmen. Wenn Sie sed mit -n '/.../p' verwenden, verhält es sich wie grep.
Ich habe ein nützliches Tutorial gefunden Hier
Für Ihren Fall könnten Sie ein Muster in etwa wie folgt betrachten:
Die oben genannten Werte passen alle Zeiten von 07:00 bis 11:59
einige erklärungen:
\d{4} = match 4 digits (year, eg. 2014)
(0[7-9]) = match 07 - 09
| = OR
(1[0-1]) = match 10 -11
quelle
Unix ist großartig, wenn es darum geht, kleine Dinge zu tun, aber nicht zu lange. Dies nimmt die awk vom verlinkten Post und fügt eine Date-Pipe hinzu.
Dies findet alle Daten am Anfang der Zeile mit 2014-03-27, Nimmt diese Ausgabe und findet alle Zeiten mit Stunden (zweites Feld) oder gleich 7 und kleiner als 11.
quelle
Mit Regex wird es kompliziert. Vielleicht reicht so etwas aus:
Erläuterung:
$1 FS $2
Ist die Zeichenkette, die aus Feld 1, einem Leerzeichen und Feld 2 besteht. Wenn sie größer oder gleich der Variablen s ist (Zeichenkettenvergleich), setzen Sie eine Variable p auf 1quelle