one-liner: alle Zeilen außer den letzten 3 drucken?

8

Ich möchte GNUs head -n -3 simulieren, das alle Zeilen mit Ausnahme der letzten 3 ausgibt, weil head auf FreeBSD diese Funktion nicht besitzt. Also denke ich an etwas wie

%Vor%

Hier habe ich 10 Zeilen verwendet, aber es kann eine beliebige Zahl größer als 3 sein.

Kann es in Perl oder anders auf FreeBSD in BASH gemacht werden?

Eine super primitive Lösung wäre

%Vor%     
Sandra Schlichting 20.09.2013, 18:04
quelle

10 Antworten

6

Dies funktioniert mit einer Pipe und einer Eingabedatei:

%Vor%     
toolic 20.09.2013, 18:23
quelle
11
%Vor%

oder

%Vor%

oder

%Vor%     
mob 20.09.2013 18:11
quelle
9
%Vor%     
Greg Bacon 21.09.2013 00:06
quelle
7

Reine Bash und einfache Werkzeuge (WC und Schnitt):

%Vor%

Haftungsausschluss - Ich habe momentan keinen Zugriff auf FreeBSD, aber das funktioniert unter OSX bash.

    
Digital Trauma 20.09.2013 18:23
quelle
5

Niemand scheint sed und tac zu verwenden, also hier eins:

%Vor%     
devnull 21.09.2013 05:13
quelle
2

Wie wäre es mit:

%Vor%     
michael501 20.09.2013 18:08
quelle
2

Dieser awk-One-Liner scheint den Job zu machen:

%Vor%     
user000001 20.09.2013 18:09
quelle
1

Oder tun Sie es mit bash allein, wenn Sie die Version 4.0 oder neuer haben:

%Vor%

Update: Dieser würde die letzten drei Zeilen entfernen, anstatt nur sie anzuzeigen.

%Vor%

Der Einfachheit halber könnte es auf eine Funktion gesetzt werden:

%Vor%     
konsolebox 20.09.2013 19:08
quelle
1

Hier ist eine späte Antwort, weil ich gestern auf so etwas gestoßen bin.

Diese Lösung ist:

  • pure bash
  • Einzeiler
  • liest den Eingabestream nur einmal
  • liest den Eingabestrom Zeile für Zeile, nicht alle auf einmal

Getestet auf Ubuntu, Redhat und OSX.

%Vor%

Es funktioniert, indem Zeilen in einen Ringpuffer eingelesen werden, der als n-Element-Array implementiert ist.

n ist die Anzahl der Zeilen, die am Ende der Datei abgeschnitten werden.

Für jede Zeile, die wir lesen, können wir die Zeile i-n aus dem Ringpuffer zurückgeben und dann die Zeile i im Ringpuffer speichern. Nichts wird wiederholt, bis die ersten n Zeilen gelesen sind. (i mod n) ist der Index in das Array, das den Ringpuffer implementiert.

Da die Anforderung für einen Einzeiler ist, habe ich versucht, es ziemlich kurz zu machen, leider auf Kosten der Lesbarkeit.

    
Digital Trauma 03.10.2013 15:03
quelle
0

Eine weitere Awk-Lösung, die nur eine minimale Menge an Puffern verwendet und Zeilen schnell druckt, ohne zuerst alle Zeilen lesen zu müssen. Es kann auch mit Rohren und großen Dateien verwendet werden.

%Vor%     
konsolebox 21.09.2013 22:47
quelle

Tags und Links