Kopf; Kopf
{ head -n[num] >/dev/null
head -n[num]
} <infile >outfile
Mit der obigen Option können Sie die erste Anzahl von Zeilen angeben, die mit dem ersten head
Befehl vom Kopf der Ausgabe entfernt werden sollen , und die Anzahl von Zeilen, in die outfile
mit dem zweiten Befehl geschrieben werden soll . Dies ist in der Regel auch schneller als sed
- insbesondere bei umfangreichen Eingaben -, obwohl zwei Aufrufe erforderlich sind. Wo auf sed
jeden Fall sollte jedoch bevorzugt wird, ist in dem Fall , dass <infile
ist nicht eine regelmäßige, lseekable Datei - denn dies wird in der Regel nicht arbeiten , wie in diesem Fall bestimmt, sondern sed
kann alle Ausgänge Änderungen in einem einzigen Skript Prozess behandeln.
Mit einer GNU können head
Sie die -
negative Form auch [num]
im zweiten Befehl verwenden. In diesem Fall werden mit dem folgenden Befehl die erste und die letzte Zeile von der Eingabe entfernt:
{ head -n1 >/dev/null
head -n-1
} <infile >outfile
ODER mit einem POSIX sed
:
Angenommen, ich habe eine Eingabe von 20 Zeilen gelesen und wollte die ersten 3 und die letzten 7 Zeilen entfernen. Wenn ich mich dazu entschließen sed
würde, würde ich dies mit einem Endpuffer tun. Ich würde zuerst drei und sieben addieren, um insgesamt zehn Streifen zu zählen, und dann tun:
seq 20 | sed -ne:n -e '3d;N;1,10bn' -eP\;D
Dies ist ein Beispiel, bei dem die ersten 3 und letzten 7 Zeilen von der Eingabe entfernt werden. Die Idee ist, dass Sie so viele Zeilen puffern können, wie Sie möchten, um das Ende der Eingabe im Musterbereich auf einem Stapel zu P
entfernen, aber nur die erste Zeile für jede eingezogene Zeile zu drucken.
- Auf Zeilen
1,10
sed
P
wird nichts gedruckt, da für jede Zeile die Eingabe zeilenweise in einer b
Ranch-Schleife im Musterraum gestapelt wird.
- In der dritten Zeile wird der gesamte
sed
Stapel d
gelöscht - und so werden die ersten drei Zeilen auf einen Schlag von der Ausgabe entfernt.
- Wenn
sed
die $
letzte Eingabezeile erreicht ist und versucht, die N
ext zu ziehen, wird EOF gedrückt und die Verarbeitung wird vollständig gestoppt. Zu diesem Zeitpunkt enthält der Musterraum jedoch alle Linien, 14,20
von denen noch keine P
gedruckt wurden und es niemals sind.
- In jeder anderen Zeile
sed
P
wird nur bis zur ersten \n
ewline im Musterbereich gedruckt und diese D
gelöscht, bevor ein neuer Zyklus mit den verbleibenden - oder den nächsten 6 Eingabezeilen beginnt. Die 7. Zeile wird mit dem N
Befehl ext im neuen Zyklus wieder an den Stack angehängt .
Von der seq
Ausgabe (die 20 fortlaufend nummerierte Zeilen umfasst) werden also sed
nur folgende Daten ausgegeben :
4
5
6
7
8
9
10
11
12
13
Dies wird problematisch, wenn die Anzahl der Zeilen, die Sie vom Ende der Eingabe entfernen möchten, groß ist - da sed
die Leistung direkt proportional zur Größe des Musterraums ist. Dennoch ist es in vielen Fällen eine praktikable Lösung - und POSIX gibt einen sed
Musterbereich vor, der vor dem Busting mindestens 4 KB verarbeitet.