it-swarm.com.de

Wie beschneiden (schneiden) Sie Textdateien basierend auf Start- und Endzeilen in cygwin?

Ich habe nur wenige Protokolldateien um jeweils 100 MB. Persönlich finde ich es schwierig, mit so großen Dateien umzugehen. Ich weiß, dass Protokollzeilen, die für mich interessant sind, nur zwischen 200 und 400 Zeilen liegen.

Was wäre ein guter Weg, um relavante Protokollzeilen aus diesen Dateien zu extrahieren, dh ich möchte nur den Zeilennummernbereich an eine andere Datei übergeben.

Zum Beispiel sind die Eingaben:

filename: MyHugeLogFile.log
Starting line number: 38438
Ending line number:   39276

Gibt es einen Befehl, den ich in cygwin ausführen kann, um cat nur diesen Bereich in dieser Datei auszuführen? Ich weiß, wenn ich diesen Bereich irgendwie in stdout anzeigen kann, dann kann ich auch an eine Ausgabedatei weiterleiten.

Hinweis: Hinzufügen des Linux-Tags für mehr Sichtbarkeit, aber ich brauche eine Lösung, die in cygwin funktionieren könnte. (Normalerweise funktionieren Linux-Befehle in Cygwin).

53
bits

Klingt nach einem Job für sed:

sed -n '8,12p' yourfile

... sendet die Zeilen 8 bis 12 von yourfile an den Standardausgang.

Wenn Sie die Zeilennummer voranstellen möchten, können Sie zuerst cat -n verwenden:

cat -n yourfile | sed -n '8,12p'
102
Johnsyweb

Mit wc -l können Sie die Gesamtzahl der Zeilen ermitteln.

Sie können dann head und tail kombinieren, um den gewünschten Bereich zu erhalten. Nehmen wir an, das Protokoll ist 40.000 Zeilen, Sie möchten die letzten 1562 Zeilen und dann die ersten 838 Zeilen.

tail -1562 MyHugeLogFile.log | head -838 | ....

Oder es gibt wahrscheinlich eine einfachere Möglichkeit, sed oder awk zu verwenden.

10
David

Ich habe diesen Thread gesehen, als ich versuchte, eine Datei in Dateien mit 100 000 Zeilen aufzuteilen. Eine bessere Lösung als sed dafür ist:

split -l 100000 database.sql database-

Es werden Dateien wie:

database-aaa
database-aab
database-aac
...
7
Dorian

Und wenn Sie einfach einen Teil einer Datei ausschneiden möchten - etwa von Zeile 26 bis 142 - und ihn in eine neue Datei eingeben: cat file-to-cut.txt | sed -n '26,142p' >> new-file.txt

6
Marc Pe-Pe

Wie wäre es damit:

$ seq 1 100000 | tail -n +10000 | head -n 10
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009

Es verwendet tail für die Ausgabe ab der 10.000sten Zeile und dann head, um nur 10 Zeilen zu erhalten.

Dasselbe (fast) Ergebnis mit sed:

$ seq 1 100000 | sed -n '10000,10010p'
10000
10001
10002
10003
10004
10005
10006
10007
10008
10009
10010

Dieser hat den Vorteil, dass Sie den Linienbereich direkt eingeben können.

4
thkala

Wenn Sie nur an den letzten X-Zeilen interessiert sind, können Sie den Befehl "tail" wie folgt verwenden.

$ tail -n XXXXX yourlogfile.log >> mycroppedfile.txt

Dadurch werden die letzten XXXXX-Zeilen Ihrer Protokolldatei in einer neuen Datei mit dem Namen "mycroppedfile.txt" gespeichert.

Dies ist ein alter Thread, aber ich war überrascht, dass niemand grep erwähnt hat. Mit der Option -A können Sie eine Anzahl von Zeilen angeben, die nach einer Suchübereinstimmung gedruckt werden sollen. Mit der Option -B werden Zeilen vor einer Übereinstimmung angezeigt. Der folgende Befehl würde 10 Zeilen vor und 10 Zeilen nach dem Vorkommen von "my search string" in der Datei "mylogfile.log" ausgeben:

grep -A 10 -B 10 "mein Suchstring" mylogfile.log

Wenn in einer großen Datei mehrere Übereinstimmungen vorhanden sind, kann die Ausgabe schnell unhandlich werden. Zwei nützliche Optionen sind -n, mit denen grep Zeilennummern einbezieht, und --color, die den übereinstimmenden Text in der Ausgabe hervorhebt.

Wenn mehr als die zu durchsuchende Datei vorhanden ist, ermöglicht grep, dass mehrere Dateien durch Leerzeichen getrennt aufgeführt werden. Platzhalter können ebenfalls verwendet werden. Alles zusammenstellen:

grep -A 10 -B 10 -n --color "meine Suchzeichenfolge" * .log someOtherFile.txt

0
hbolingbroke