Wie kann ich einen Teil der Textdatei per Terminal erhalten?

7

Wie kann ich einen Textblock durch Zeilen erhalten?

Ich habe eine Protokolldatei mit 6000000 Zeilen und möchte nur einen Block von 607366 bis 700000 erhalten.

Ich habe so etwas versucht wie:

head -n 607366 | tail -700000 server.log > outputFile.txt
Emanuella Ramos Cavalcante
quelle

Antworten:

8

Sie können verwenden sed:

sed -n 607366,700000p server.log > outputFile.txt

Wenn Sie verwenden möchten , headund tailist dies der richtige Weg:

head -n 700000 server.log | tail -n $(echo 700000-607366+1 | bc) > outputFile.txt

oder kürzer:

head -n 700000 server.log | tail -n 92635 > outputFile.txt
Radu Rădeanu
quelle
Vielen Dank für Ihre Antwort, aber die Ausgabe begann nicht in Zeile 607366: /
Emanuella Ramos Cavalcante
@EmanuellaRamosCavalcante Bitte erneut prüfen; Ich bin sicher, dass es von dort aus beginnt: /
Radu Rădeanu
@ RaduRădeanu vielleicht können Sie mit einer ähnlichen Frage hier helfen: unix.stackexchange.com/questions/94464/…
JohnMerlino
2

Optimierungen an Radus:

sed '607366,$!d;700000q' server.log > outputFile.txt

Auf diese Weise halten wir lesen ( q) , server.lognachdem wir die 700000 finden ten Zeile.

head -n 700000 server.log | tail -n "$((700000-607366+1))"

Hier muss nicht aufgerufen bcwerden, wir können die Standard-Arithmetik-Erweiterung verwenden.

Aber umgekehrt wird es viel effizienter sein:

tail -n +607366 | head -n "$((700000-607366+1))"

da es nicht darum geht, eine große Anzahl von Zeilen im Speicher zu speichern.

Stéphane Chazelas
quelle