Frage

Ich habe eine sehr lange Datei, die ich aber das Überspringen der ersten 1e6 Linien zum Beispiel drucken möchten. Ich sehe in der Katze Manpage aber ich habe keine Möglichkeit, dies zu tun. Ich bin für einen Befehl suche diesen oder ein einfaches Bash-Programm zu tun.

War es hilfreich?

Lösung

Sie werden 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 SKIP müssen, verwenden Sie

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

Das heißt, wenn Sie N Zeilen überspringen möchten, können Sie Druckzeile N + 1 beginnen. Beispiel:

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

Wenn Sie wollen einfach nur die letzten so viele Zeilen sehen, lassen Sie die „+“:

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

Andere Tipps

Wenn Sie GNU Schwanz auf Ihrem System zur Verfügung haben, können Sie wie folgt vor:

tail -n +1000001 huge-file.log

Es ist der + Charakter, das tut, was Sie wollen. Ein Zitat aus der man-Seite:

  

Wenn das erste Zeichen von K (die Anzahl von Bytes oder Zeilen) ein   `+‘, Beginnend Druck mit dem K-ten Elemente von Anfang jeder Datei.

So wie im Kommentar erwähnt, setzt +1000001 den Druckvorgang beginnt mit dem ersten Punkt nach den ersten 1 Million Zeilen.

Der einfachste Weg, fand ich die ersten zehn Zeilen einer Datei zu entfernen:

$ sed 1,10d file.txt

Eine weniger ausführliche Version mit AWK:

awk 'NR > 1e6' myfile.txt

Aber ich würde empfehlen, ganze Zahlen verwendet wird.

Nur eine sed Alternative vorzuschlagen. :) Zum ersten eine Million Zeilen überspringen, versuchen |sed '1,1000000d'.

Beispiel:

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

Wenn Sie zum ersten Mal zwei Zeilen
überspringen wollen tail -n +3 <filename>

Wenn Sie zuerst x Zeile
überspringen wollen tail -n +$((x+1)) <filename>

Wenn Sie die ersten 10 Zeile sehen Sie, wie unten sed verwenden:

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

oder wenn Sie Zeilen 20 bis 30 sehen wollen, können Sie:

sed -n '20,30 p' myFile.txt

Dieser 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

Wird mit dieser Beispieldatei (file.txt):

one
two
three
four
five
six

Der Befehl (aus zweiten bis vierten Zeile in der Datei extrahieren):

edu@debian5:~$./script.sh 2 4 file.txt

Ausgabe dieses Befehls:

two
three
four

Natürlich können Sie es verbessern, zum Beispiel durch das Testen, dass alle Argumentwerte sind die erwartete: -)

Sie können dies tun, um die Kopf- und Schwanz Befehle:

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

wobei num ist 1e6 + die Anzahl der Zeilen Sie drucken möchten.

sed -n '1d;p'

Mit diesem Befehl wird die erste Zeile löschen und den Rest drucken

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

Ich brauchte die gleichen und fand diesen Thread zu tun.

Ich habe versucht, „tail -n +, aber es nur gedruckt alles.

Je mehr + Linien gearbeitet schön auf der Eingabeaufforderung, aber es stellte sich heraus, dass es ganz anders verhielten, wenn sie in Headless Modus (cronjob) ausgeführt werden.

Ich schrieb schließlich diese selbst:

skip=5
FILE="/tmp/filetoprint"
tail -n$((`cat "${FILE}" | wc -l` - skip)) "${FILE}"
scroll top