Antworten:
Hiermit können Sie die ersten beiden Zeilen entfernen:
tail -n +3 foo.txt
und dies, um die letzten beiden Zeilen zu entfernen:
head -n -2 foo.txt
(vorausgesetzt die Datei endet mit \n
für letztere)
Genau wie bei der Standardnutzung von tail
und sind head
diese Vorgänge nicht destruktiv. Verwenden >out.txt
Sie diese Option, wenn Sie die Ausgabe in eine neue Datei umleiten möchten:
tail -n +3 foo.txt >out.txt
Falls out.txt
bereits vorhanden, wird diese Datei überschrieben. Verwenden Sie >>out.txt
anstelle von, >out.txt
wenn die Ausgabe lieber angehängt werden soll out.txt
.
head -n -2
ist nicht POSIX-kompatibel .
Wenn Sie alle außer den ersten N-1-Leitungen möchten, rufen Sie tail
mit der Anzahl der Leitungen an +N
. (Die Nummer ist die Nummer der ersten Zeile, die Sie beibehalten möchten, beginnend mit 1, dh +1 bedeutet, dass oben begonnen wird, +2 bedeutet, dass eine Zeile übersprungen wird usw.).
tail -n +3 foo.txt >>other-document
Es gibt keine einfache, tragbare Möglichkeit, die letzten N Zeilen zu überspringen. GNU head
erlaubt head -n +N
als Gegenstück von tail -n +N
. Andernfalls, wenn Sie tac
(zB GNU oder Busybox) haben, können Sie es mit Tail kombinieren:
tac | tail -n +3 | tac
Portabel können Sie einen awk-Filter verwenden (ungetestet):
awk -vskip=2 '{
lines[NR] = $0;
if (NR > skip) print lines[NR-skip];
delete lines[NR-skip];
}'
Wenn Sie die letzten Zeilen aus einer großen Datei entfernen möchten, können Sie den Byte-Versatz des zu schneidenden Teils bestimmen und anschließend die Kürzung mit ausführen dd
.
total=$(wc -c < /file/to/truncate)
chop=$(tail -n 42 /file/to/truncate | wc -c)
dd if=/dev/null of=/file/to/truncate seek=1 bs="$((total-chop))"
Sie können eine Datei am Anfang nicht abschneiden. Wenn Sie jedoch die ersten Zeilen einer großen Datei entfernen müssen, können Sie den Inhalt verschieben .
Aus der tail
Manpage (also GNU tail
):
-n, --lines=K
output the last K lines, instead of the last 10; or use -n +K to
output lines starting with the Kth
Daher sollten im Folgenden alle bis auf die ersten zwei Zeilen von somefile.txt
an angehängt werden anotherfile.txt
:
tail --lines=+3 somefile.txt >> anotherfile.txt
Zum Entfernen der ersten n Zeilen kann GNU sed verwendet werden. Zum Beispiel, wenn n = 2 ist
sed -n '1,2!p' input-file
Der !
Mittelwert "dieses Intervall ausschließen". Wie Sie sich vorstellen können, kann zum Beispiel ein komplizierteres Ergebnis erzielt werden
sed -n '3,5p;7p'
das wird Linie 3,4,5,7 zeigen. Die Verwendung regulärer Ausdrücke anstelle von Adressen erhöht die Leistung.
Die Einschränkung besteht darin, dass die Zeilennummern im Voraus bekannt sein müssen.
Während tail -n +4
die Ausgabe der Datei ab der 4. Zeile (alle bis auf die ersten 3 Zeilen) Standard und portabel ist, ist dies nicht das head
Gegenstück ( head -n -3
alle bis auf die letzten 3 Zeilen).
Portabel, würden Sie tun:
sed '$d' | sed '$d' | sed '$d'
Oder:
sed -ne :1 -e '1,3{N;b1' -e '}' -e 'P;N;D'
(Beachten Sie, dass auf einigen Systemen, auf denen sed
ein Musterbereich von begrenzter Größe vorhanden ist, dieser nicht auf große Werte von skaliert n
).
Oder:
awk 'NR>3 {print l[NR%3]}; {l[NR%3]=$0}'
Hoffe, ich habe Ihr Bedürfnis klar verstanden.
Sie haben verschiedene Möglichkeiten, Ihre Anfrage zu bearbeiten:
tail -n$(expr $(cat /etc/passwd|wc -l) - 2) /etc/passwd
Wo / etc / passwd ist Ihre Datei
Die 2. Lösung kann nützlich sein, wenn Sie eine große Datei haben:
my1stline=$(head -n1 /etc/passwd)
my2ndline=$(head -n2 /etc/passwd|grep -v "$my1stline")
cat /etc/passwd |grep -Ev "$my1stline|$my2ndline"
\n
“ .. Es funktioniert für alle negativen ganzen Zahlen außer-n -0
denen gibt gar nichts , so wie-n 0
würde (mit: Kopf (GNU coreutils) 7.4) ... Wenn jedoch ein nachlauf\n
vorhanden ist,-n -0
macht Druck wie von der zu erwarten ist-
, dh. er druckt die gesamte Datei ... So ist es für alle Nicht-Null negative Werte funktioniert .. aber-0
schlägt fehl , wenn es keine Hinter ist\n