it-swarm.com.de

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

Ich habe eine sehr lange Datei, die ich ausdrucken möchte, aber zum Beispiel die ersten 1e6-Zeilen überspringe. Ich schaue in die Cat-Manpage, habe aber keine Option dafür gefunden. Ich suche einen Befehl, um dies zu tun, oder ein einfaches Bash-Programm.

477
Eduardo

Du wirst Schwanz brauchen. Einige Beispiele:

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

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

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

Das heißt, wenn Sie N Zeilen überspringen möchten, beginnen Sie mit dem Drucken 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 vielen Zeilen sehen möchten, lassen Sie das "+" weg:

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

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

tail -n +1000001 huge-file.log

Es ist der + Charakter, der macht, was Sie wollen. So zitieren Sie aus der Manpage:

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

Wie im Kommentar erwähnt, wird beim Einfügen von +1000001 mit dem ersten Element nach den ersten 1.000.000 Zeilen gedruckt.

92
Eddie

Am einfachsten entferne ich die ersten zehn Zeilen einer Datei:

$ sed 1,10d file.txt
90
David Parks

Eine weniger ausführliche Version mit AWK:

awk 'NR > 1e6' myfile.txt

Aber ich würde empfehlen, ganzzahlige Zahlen zu verwenden.

25
newtover

Nur um eine sed Alternative vorzuschlagen. :) Um die ersten eine Million Zeilen zu überspringen, versuchen Sie |sed '1,1000000d'.

Beispiel:

$ Perl -wle 'print for (1..1_000_005)'|sed '1,1000000d'
1000001
1000002
1000003
1000004
1000005
13
tuomassalo

wenn Sie die ersten beiden Zeilen überspringen möchten
tail -n +3 <filename>

wenn Sie die erste x-Zeile überspringen möchten
tail -n +$((x+1)) <filename>

13
saipraneeth

Wenn Sie die ersten 10 Zeilen sehen möchten, können Sie sed wie folgt verwenden:

sed -n '1,10 p' myFile.txt

oder wenn Sie Linien von 20 bis 30 sehen möchten, können Sie verwenden:

sed -n '20,30 p' myFile.txt
13
Kadir YILDIZ

Verwenden Sie den Befehl sed delete mit einem Bereichsadresse . Zum Beispiel:

$ sed 1,100d file.txt # Print file.txt omitting lines 1-100.

Wenn Sie alternativ nur einen bekannten Bereich drucken möchten, verwenden Sie den Druckbefehl mit dem Flag -n:

$ sed -n 201,300p file.txt # Print lines 201-300 from file.txt

Diese Lösung sollte auf allen UNIX-Systemen zuverlässig funktionieren, unabhängig davon, ob Dienstprogramme GNU vorhanden sind.

12
maerics

Dieses Shell-Skript funktioniert gut für mich:

#!/bin/bash
awk -v initial_line=$1 -v end_line=$2 '{
    if (NR >= initial_line && NR <= end_line) 
    print $0
}' $3

Verwendet mit dieser Beispieldatei (file.txt):

one
two
three
four
five
six

Der Befehl (wird aus der zweiten bis vierten Zeile der Datei extrahiert):

[email protected]:~$./script.sh 2 4 file.txt

Ausgabe dieses Befehls:

two
three
four

Natürlich können Sie es verbessern, indem Sie beispielsweise testen, ob alle Argumentwerte den Erwartungen entsprechen :-)

10
sourcerebels

Sie können dies mit den Befehlen head und tail tun:

head -n <num> | tail -n <lines to print>

dabei ist die Zahl 1e6 + die Anzahl der zu druckenden Zeilen.

6
Dana the Sane
sed -n '1d;p'

dieser Befehl löscht die erste Zeile und druckt den Rest aus

5
cat < File > | awk '{if(NR > 6) print $0}'
3
aamadeo