Ich habe großen Dateitext (fast 3 GB) - es ist eine Protokolldatei. Ich möchte Textzeilen aus dieser Datei vom 13. bis 19. Juli erhalten, die einer Reihe von Daten entsprechen. Mein Protokollformat ist:
2016-07-12 < ?xml version>
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
2016-07-20 < ?xml version>
sample text sample text
sample text sample text
sample text sample text
2016-07-20 < ?xml version>
sample text sample text
2016-07-20 < ?xml version>
also nach grep
/ sed
sollte es wie folgt ausgegeben werden:
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
Wie kann ich das bekommen?
command-line
grep
sed
Corey
quelle
quelle
Antworten:
Mit
grep
wenn Sie die Anzahl der Zeilen wissen wollen , Sie Kontext - Option verwenden können-A
Zeilen nach dem Muster druckenDas gibt Ihnen die Zeile mit 2013-07-13 und den nächsten 3 Zeilen
Mit können
sed
Sie die Daten verwenden, um so abzugrenzenHiermit werden alle Zeilen von der ersten Zeile bis zum 13.07.2016 bis einschließlich der ersten Zeile bis zum 19.07.2016 gedruckt. Dies setzt jedoch voraus, dass Sie mit dem 19.07.2016 nur eine Zeile haben (die nächste Zeile wird nicht gedruckt). Wenn mehrere Zeilen vorhanden sind, verwenden Sie stattdessen das nächste Datum und
d
löschen Sie die Ausgabe darausquelle
Dieser einfache Grep One Liner wird ausreichen:
Funktioniert hier gut und es besteht keine Notwendigkeit für sed :)
Verweise:
quelle
^
, damit es funktioniert. Mac verwenden.awk
Lösung:Grundsätzlich wird jede Zeile von der beginnenden
2016-07-13
bis zur beginnenden Zeile gedruckt2016-07-19
quelle
Alle anderen aktuellen Antworten beruhen auf der Tatsache, dass die Protokolldateieinträge chronologisch sortiert sind oder dass der Datumsbereich leicht mit regulären Ausdrücken abgeglichen werden kann. Wenn Sie eine allgemeinere Lösung wünschen, müssen wir etwas mehr programmieren.
Ich präsentiere dieses GNU AWK-Skript:
Sie geben die Start- und Endzeit über die Variablen
starttime
undendtime
in einem Format an, dasmktime
versteht (YYYY MM DD hh dd ss
). Daher führen Sie denawk
Befehl wie folgt aus, vorausgesetzt, das obige Awk-Skript befindet sich in einer ausführbaren Dateifilter-log-dates.awk
im aktuellen Arbeitsverzeichnis und die Protokolldatei lautetmylog.txt
:Beachten Sie, dass die Endzeit exklusiv ist , dh gültige Protokollsätze müssen vor der Endzeit einen Zeitstempel haben.
Wenn Ihr Zeitstempelformat anders ist, können Sie den an die
match
Funktion übergebenen regulären Ausdruck entsprechend anpassen .quelle
Sie könnten es in Schritten tun. Suchen Sie die Nummer der ersten Zeile, die Ihrem Startmuster entspricht. Suchen Sie die Nummer der letzten Zeile, die Ihrem Endmuster entspricht. Extrahieren Sie dann den Test zwischen diesen beiden Zeilen. Dies kann wie folgt erfolgen.
Dies kann alles in einem
awk
Befehl erfolgen, aber die Schritte können das Befolgen erleichtern. Innerhalb von awk ist die NR-Variable die aktuelle Zeilennummer. Da nach dem Muster keine Aktion angegeben wurde (NR> = 1234 && NR <= 5678), werden standardmäßig die Zeilen gedruckt, die sich in diesem Bereich befinden.quelle