Gegenüber dem Schwanz: alle Zeilen außer den letzten n Zeilen

32454
Hans-Peter Störr

Wie kann ich die letzten n Zeilen einer Datei mit einem Unix-Befehlszeilenfilter löschen?

Das wäre so etwas wie das Gegenteil von tail: tailverwirft die ersten n Zeilen, leitet den Rest durch, aber ich möchte, dass der Befehl alles durchlässt, mit Ausnahme der letzten n Zeilen.

Leider habe ich nichts dergleichen gefunden - headhilft auch nicht. BEARBEITEN : Zumindest in Solaris gibt es keine negativen Argumente.

26
FYI bei Verwendung von head: Durch Platzieren von "-" vor der Nummer mit der Option -n werden alle Zeilen jeder Datei gedruckt, nicht jedoch die letzten N Zeilen, wie unten gezeigt. G Koe vor 11 Jahren 0

4 Antworten auf die Frage

31
user570500

If you have GNU head, you can use

head -n -5 file.txt 

to print all but the last 5 lines of file.txt.

If head -n takes no negative arguments, try

head -n $(( $(wc -l file.txt | awk '') - 5 )) file.txt 
(und beten Sie, dass `file.txt` mindestens sechs Zeilen lang ist ...) a CVn vor 11 Jahren 10
Leider funktioniert diese Nicht-GNU-Version auch nicht mit Streams Armand vor 8 Jahren 1
@ MichaelKjörling Zumindest auf Ubuntu ist das kein Problem. Wenn die Dateien weniger Zeilen enthalten als in head angegeben, wird eine leere Ausgabe ohne Fehler zurückgegeben. Alphaaa vor 7 Jahren 1
Wenn ich mich nicht irre, wird head -n 5 die ersten 5 Zeilen drucken, aber nicht alle, sondern die letzten 5 ... pypmannetjies vor 6 Jahren 0
5
jwd

Hier ist eine einfache Möglichkeit, die letzte Zeile zu löschen, die bei BSD usw. funktioniert.

sed '$d' input.txt 

Der Ausdruck lautet "in der letzten Zeile löschen". Die anderen Zeilen werden gedruckt, da dies das sedStandardverhalten ist.

Sie können sie miteinander verketten, um mehrere Zeilen zu entfernen

sed '$d' input.txt | sed '$d' | sed '$d' 

Was zwar zugegebenermaßen etwas schwerfällig ist, aber nur einen einzigen Scan durch die Datei durchführt.

Sie können auch einen Blick darauf werfen, um weitere Antworten zu erhalten: https://stackoverflow.com/questions/13380607/how-to-use-sed-to-remove-last-n-lines-of-a-file

Hier ist ein One-Liner, der von einem meiner Favoriten dort angepasst wurde:

N=10 sed -n -e ':a' -e "1,$N!;N;ba" 

Ich hatte Spaß daran, diese zu entschlüsseln, und ich hoffe, dass Sie das auch tun (: Es puffert NZeilen beim Scannen, aber ansonsten ist es ziemlich effizient.

4
Kjetil S.
head file.txt # first 10 lines tail file.txt # last 10 lines head -n 20 file.txt # first 20 lines tail -n 20 file.txt # last 20 lines head -20 file.txt # first 20 lines tail -20 file.txt # last 20 lines head -n -5 file.txt # all lines except the 5 last tail -n +5 file.txt # all lines except the 4 first, starts at line 5 
Was macht dieses Add, das in der akzeptierten Antwort nicht beantwortet wurde? Wie bei Ihren anderen Antworten würde auch ein paar Zeilen zur Erklärung Ihrer Antwort diese erheblich verbessern. music2myear vor 7 Jahren 1
sehr gute zusammenfassung ruanhao vor 7 Jahren 1
2
Anders R. Bystrup

Ich bin neugierig, warum Sie denken, dass dies headkeine Option ist:

~$ man head ... -n, --lines=[-]K print the first K lines instead of the first 10;  with the leading `-', print all but the last K lines of each file 

Dies scheint zu Ihrem Zweck zu passen, zum Beispiel:

head -n -20 yourfile.txt 
Beachten Sie, dass dies nur für GNU `head` gilt. BSD `head` hat diese Option nicht, daher funktioniert diese Antwort * nicht * auf Solaris oder anderen Unixen ohne GNU-Coreutils. Das OP hat dies auch speziell mit Unix und Unix-Utils markiert. slhck vor 11 Jahren 5
@slhck Ganz zu schweigen von der Tatsache, dass das OP erwähnt hat, dass dies für Solaris ist. a CVn vor 11 Jahren 2
Leider hat jemand meine Erwähnung von Solaris entfernt. Ich hätte aber trotzdem erwähnen sollen, dass die Version von head das nicht unterstützt. Hans-Peter Störr vor 11 Jahren 0
Entschuldigung alle. Ich habe Solaris nicht bemerkt, und mir waren die verschiedenen Versionen von head nicht bekannt. Anders R. Bystrup vor 11 Jahren 1
@ hstoerr Solaris ist jetzt in Ihren Tags :) slhck vor 11 Jahren 0
funktioniert nicht auf Mac MichaelChirico vor 6 Jahren 0