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 headBefehl vom Kopf der Ausgabe entfernt werden sollen , und die Anzahl von Zeilen, in die outfilemit 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 sedjeden Fall sollte jedoch bevorzugt wird, ist in dem Fall , dass <infileist nicht eine regelmäßige, lseekable Datei - denn dies wird in der Regel nicht arbeiten , wie in diesem Fall bestimmt, sondern sedkann alle Ausgänge Änderungen in einem einzigen Skript Prozess behandeln.
Mit einer GNU können headSie 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 sedwü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 Pentfernen, aber nur die erste Zeile für jede eingezogene Zeile zu drucken.
- Auf Zeilen
1,10 sed Pwird nichts gedruckt, da für jede Zeile die Eingabe zeilenweise in einer bRanch-Schleife im Musterraum gestapelt wird.
- In der dritten Zeile wird der gesamte
sedStapel dgelöscht - und so werden die ersten drei Zeilen auf einen Schlag von der Ausgabe entfernt.
- Wenn
seddie $letzte Eingabezeile erreicht ist und versucht, die Next zu ziehen, wird EOF gedrückt und die Verarbeitung wird vollständig gestoppt. Zu diesem Zeitpunkt enthält der Musterraum jedoch alle Linien, 14,20von denen noch keine Pgedruckt wurden und es niemals sind.
- In jeder anderen Zeile
sed Pwird nur bis zur ersten \newline im Musterbereich gedruckt und diese Dgelöscht, bevor ein neuer Zyklus mit den verbleibenden - oder den nächsten 6 Eingabezeilen beginnt. Die 7. Zeile wird mit dem NBefehl ext im neuen Zyklus wieder an den Stack angehängt .
Von der seqAusgabe (die 20 fortlaufend nummerierte Zeilen umfasst) werden also sednur 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 seddie Leistung direkt proportional zur Größe des Musterraums ist. Dennoch ist es in vielen Fällen eine praktikable Lösung - und POSIX gibt einen sedMusterbereich vor, der vor dem Busting mindestens 4 KB verarbeitet.