Lösung 1:
sed -n '10000000,10000020p' filename
Sie können das vielleicht so etwas beschleunigen:
sed -n '10000000,10000020p; 10000021q' filename
In diesen Befehlen ist die Option -n
verursacht sed
um "automatisches Drucken des Musterraums zu unterdrücken". Die p
Befehl "print[s] the current pattern space" und q
Befehl "Sed-Skript sofort beenden, ohne weitere Eingaben zu verarbeiten ..." Die Anführungszeichen stammen aus sed
man
Seite.
Übrigens, Ihr Befehl
tail -n 10000000 filename | head 10
beginnt bei der zehnmillionsten Zeile vom Ende der Datei, während Ihr "mittlerer" Befehl am zehnmillionsten vom Anfang zu beginnen scheint was äquivalent wäre zu:
head -n 10000010 filename | tail 10
Das Problem ist, dass bei unsortierten Dateien mit Zeilen variabler Länge jeder Prozess die Datei durchlaufen muss, um Zeilenumbrüche zu zählen. Es gibt keine Möglichkeit, das abzukürzen.
Wenn die Datei jedoch sortiert ist (z. B. eine Protokolldatei mit Zeitstempeln) oder Zeilen mit fester Länge hat, können Sie die Datei anhand einer Byte-Position durchsuchen. Im Beispiel der Protokolldatei könnten Sie eine binäre Suche für eine Reihe von Zeiten durchführen, wie es mein Python-Skript hier * tut. Im Fall der Datei mit fester Datensatzlänge ist es wirklich einfach. Sie suchen einfach nach linelength * linecount
Zeichen in die Datei.
Lösung 2:
Ich habe die folgende Verwendung von sed
herausgefunden
sed -n '10000000,+20p' filename
Hoffe, es ist für jemanden nützlich!
Lösung 3:
Dies ist das erste Mal, dass ich hier poste! Wie auch immer, dieser ist einfach. Angenommen, Sie möchten Zeile 8872 aus Ihrer Datei namens file.txt ziehen. So geht's:
cat -n Datei.txt | grep '^ *8872'
Jetzt geht es darum, 20 Zeilen danach zu finden. Um dies zu erreichen, tun Sie
cat -n Datei.txt | grep -A 20 '^ *8872'
Für Zeilen davor oder davor siehe die Flags -B und -C im grep-Handbuch.