808 Stimmen

Drucken einer Datei, wobei die ersten X Zeilen übersprungen werden, in Bash

Ich habe eine sehr lange Datei, die ich ausdrucken möchte, wobei ich z. B. die ersten 1.000.000 Zeilen überspringen möchte.

Ich habe in der Manpage von cat nachgeschaut, aber ich habe keine Option gefunden, die dies ermöglicht. Ich bin auf der Suche nach einem Befehl oder einem einfachen Bash-Programm, um dies zu tun.

1327voto

Du brauchst einen Schwanz. Einige Beispiele:

$ tail great-big-file.log
< Last 10 lines of great-big-file.log >

Wenn Sie wirklich eine bestimmte Anzahl von "ersten" Zeilen SKIPen müssen, verwenden Sie

$ tail -n +<N+1> <filename>
< filename, excluding first N lines. >

Das heißt, wenn Sie N Zeilen überspringen wollen, beginnen Sie mit dem Druck der Zeile N+1. Beispiel:

$ tail -n +11 /tmp/myfile
< /tmp/myfile, starting at line 11, or skipping the first 10 lines. >

Wenn Sie nur die letzten so und so vielen Zeilen sehen wollen, lassen Sie das "+" weg:

$ tail -n <N> <filename>
< last N lines of file. >

95 Stimmen

Oder "tail --lines=+<LinesToSkip> ..." für die Leute mit lesbaren Befehlen :-)

51 Stimmen

In centos 5.6 tail -n +1 zeigt die gesamte Datei und tail -n +2 überspringt die erste Zeile. seltsam. Dasselbe gilt für tail -c +<num> .

0 Stimmen

Nick, es kann sein, dass Sie mit den Zeilenenden von Windows nicht zurechtkommen.

181voto

David Parks Punkte 28103

Das ist der einfachste Weg, um die ersten zehn Zeilen einer Datei zu entfernen:

$ sed 1,10d file.txt

Im allgemeinen Fall, in dem X ist die Anzahl der zu löschenden Anfangszeilen; dies ist den Kommentatoren und Redakteuren zu verdanken:

$ sed 1,Xd file.txt

15 Stimmen

Im allgemeineren Fall müssten Sie Folgendes verwenden sed 1,Xd wobei X die Anzahl der zu löschenden Anfangszeilen ist, wobei X größer als 1 ist.

2 Stimmen

Dies ist sinnvoller, wenn Sie nicht wissen, wie lang die Datei ist, und dies nicht mitteilen wollen tail um die letzten 100000000 Zeilen zu drucken.

1 Stimmen

@springloaded Wenn Sie die Anzahl der Zeilen in der Datei wissen müssen, können Sie sie mit 'wc -l' leicht ermitteln

119voto

Eddie Punkte 52504

Wenn Sie GNU tail auf Ihrem System verfügbar haben, können Sie folgendes tun:

tail -n +1000001 huge-file.log

Es ist die + Zeichen, das tut, was Sie wollen. Um aus der Manpage zu zitieren:

Wenn das erste Zeichen von K (die Anzahl der Bytes oder Zeilen) ein +' ist, wird mit dem K-ten Element vom Anfang jeder Datei beginnend gedruckt.

Wie im Kommentar erwähnt, beginnt der Druck also mit dem ersten Element nach den ersten 1.000.000 Zeilen, wenn Sie +1000001 eingeben.

0 Stimmen

Funktioniert auch für BSD Tail (OS X)

0 Stimmen

@Lloeki Fantastisch! BSD head unterstützt keine negativen Zahlen wie GNU, also nahm ich an, dass tail keine positiven Zahlen (mit +) akzeptiert, da das sozusagen das Gegenteil ist. Wie auch immer, danke.

1 Stimmen

Und um diese Antwort zu verdeutlichen: tail -n +2 huge-file.log würde die erste Zeile überspringen und in Zeile 2 weitermachen. Um also die erste Zeile zu überspringen, verwenden Sie +2. In der Antwort von @saipraneeth wird dies gut erklärt.

64voto

saipraneeth Punkte 587

Wenn Sie die ersten beiden Zeilen überspringen möchten:

tail -n +3 <filename>

Wenn Sie die erste x-Zeile überspringen wollen:

tail -n +$((x+1)) <filename>

7 Stimmen

Dies ist etwas irreführend, denn jemand könnte die (x+1) buchstäblich. Zum Beispiel können sie für x=2 entweder (2+1) oder sogar (3) die beide nicht funktionieren würden. Eine bessere Schreibweise könnte sein: Um die ersten X Zeilen zu überspringen, mit Y=X+1, verwenden Sie tail -n +Y <filename>

43voto

newtover Punkte 29616

Eine weniger ausführliche Version mit AWK:

awk 'NR > 1e6' myfile.txt

Ich würde aber empfehlen, ganzzahlige Zahlen zu verwenden.

9 Stimmen

Nützlich, wenn Sie einige Zeilen in der Mitte der Datei überspringen müssen, z. B., awk '!(5 < NR && NR < 10)'

0 Stimmen

Diese Version funktioniert mit den Cygwin-Tools, die mit Git für Windows mitgeliefert werden, während tail y sed nicht. Zum Beispiel git -c color.status=always status -sb | awk 'NR > 1' gibt einen netten minimalen Statusbericht ohne jegliche Zweiginformationen, was nützlich ist, wenn Ihre Shell bereits Zweiginformationen in der Eingabeaufforderung anzeigt. Ich weise diesen Befehl dem Alias gs was wirklich einfach zu tippen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X