676 Stimmen

Wie kann ich einen bestimmten Bereich von Zeilen aus einer Textdatei unter Unix extrahieren?

Ich habe einen SQL-Dump mit ~23000 Zeilen, der Daten aus mehreren Datenbanken enthält. Ich muss einen bestimmten Abschnitt dieser Datei (d. h. die Daten für eine einzelne Datenbank) extrahieren und in eine neue Datei einfügen. Ich kenne sowohl die Anfangs- als auch die Endzeilennummer der gewünschten Daten.

Kennt jemand einen Unix-Befehl (oder eine Reihe von Befehlen), um alle Zeilen aus einer Datei zwischen z.B. Zeile 16224 und 16482 zu extrahieren und sie dann in eine neue Datei umzuleiten?

972voto

boxxar Punkte 10473
sed -n '16224,16482p;16483q' filename > newfile

Von der sed Handbuch :

p - Druckt den Musterraum aus (auf der Standardausgabe). Dieser Befehl wird normalerweise nur in Verbindung mit der Befehlszeilenoption -n verwendet.

n - Wenn die automatische Druckfunktion nicht deaktiviert ist, wird das Musterleerzeichen gedruckt, dann wird das Musterleerzeichen durch die nächste Eingabezeile ersetzt. Wenn keine weiteren Eingaben vorhanden sind, wird sed beendet, ohne weitere Befehle.

q - Ausfahrt sed ohne weitere Befehle oder Eingaben zu verarbeiten. Beachten Sie, dass der aktuelle Musterraum gedruckt wird, wenn der automatische Druck nicht mit der Option -n deaktiviert wurde.

y

Adressen in einem sed-Skript können in einer der folgenden Formen vorliegen:

Nummer Wenn Sie eine Zeilennummer angeben, wird nur diese Zeile in der Eingabe gefunden.

Ein Adressbereich kann durch Angabe von zwei Adressen spezifiziert werden durch ein Komma (,) getrennt. Ein Adressbereich entspricht Zeilen ab wo die erste Adresse übereinstimmt, und geht weiter bis zur zweiten Adresse übereinstimmt (einschließlich).

238voto

JXG Punkte 7063
sed -n '16224,16482 p' orig-data-file > new-file

Dabei sind 16224,16482 die Nummer der Anfangszeile und die Nummer der Endzeile, jeweils einschließlich. Dies ist 1-indiziert. -n unterdrückt das Echo der Eingabe als Ausgabe, was Sie offensichtlich nicht wollen; die Zahlen geben den Bereich der Zeilen an, auf die der folgende Befehl angewendet werden soll; der Befehl p druckt die entsprechenden Zeilen aus.

140voto

manveru Punkte 2600

Ganz einfach mit Kopf/Schwanz:

head -16482 in.sql | tail -258 > out.sql

mit sed:

sed -n '16224,16482p' in.sql > out.sql

unter Verwendung von awk:

awk 'NR>=16224&&NR<=16482' in.sql > out.sql

45voto

Mark Janssen Punkte 13825

Sie könnten 'vi' und dann den folgenden Befehl verwenden:

:16224,16482w!/tmp/some-file

Alternativ dazu:

cat file | head -n 16482 | tail -n 258

EDIT:- Nur zur Erläuterung: Sie verwenden Kopf -n 16482 um die ersten 16482 Zeilen anzuzeigen, dann verwenden Sie tail -n 258 um die letzten 258 Zeilen aus der ersten Ausgabe zu erhalten.

34voto

fedorqui Punkte 249453

Es gibt einen weiteren Ansatz mit awk :

awk 'NR==16224, NR==16482' file

Wenn die Datei sehr groß ist, kann es sinnvoll sein, die exit nachdem Sie die letzte gewünschte Zeile gelesen haben. Auf diese Weise werden die folgenden Zeilen nicht unnötig gelesen:

awk 'NR==16224, NR==16482-1; NR==16482 {print; exit}' file

awk 'NR==16224, NR==16482; NR==16482 {exit}' file

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X