it-swarm.com.de

Gegenteil von tail: alle Zeilen mit Ausnahme der letzten n Zeilen

Wie kann ich die letzten n Zeilen einer Datei mit einem Unix-Befehlszeilenfilter verwerfen?

Das wäre das Gegenteil von tail: tail verwirft die ersten n Zeilen, leitet aber den Rest durch, aber ich möchte, dass der Befehl alles durchläuft , außer die letzten n Zeilen.

Leider habe ich so etwas nicht gefunden - head hilft auch nicht. EDIT: Zumindest in Solaris werden keine negativen Argumente verwendet.

Update: Ich bin hauptsächlich an einer Lösung interessiert, die für große Dateien funktioniert, d. H. Für Protokolldateien, bei denen Sie möglicherweise überprüfen möchten, was in den letzten Minuten geschehen ist.

32

Wenn Sie GNU head haben, können Sie verwenden

head -n -5 file.txt

um alle bis auf die letzten 5 Zeilen von file.txt zu drucken.

Wenn head -n keine negativen Argumente akzeptiert, versuchen Sie es

head -n $(( $(wc -l file.txt | awk '{print $1}') - 5 )) file.txt
37
user570500

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

sed '$d' input.txt

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

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

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

Das ist zwar etwas unbeholfen, durchsucht die Datei aber nur einmal.

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- Zeilen einer Datei

Hier ist ein Einzeiler, angepasst von einem meiner Favoriten:

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

Es hat mir Spaß gemacht, diese zu entziffern, und ich hoffe, dass Sie es auch tun (: Es puffert N Zeilen beim Scannen, aber ansonsten ist es ziemlich effizient.

5
jwd
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
4
Kjetil S.

Ich bin gespannt, warum du denkst, dass head keine 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 mit:

head -n -20 yourfile.txt
3

Eine andere Möglichkeit, dies zu tun, wenn tail -n keine negativen Argumente akzeptiert, ist

tac file.txt | tail -n +6 | tac

Dies würde die letzten 5 Zeilen entfernen

0
atw31337