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
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%Reine Bash und einfache Werkzeuge (WC und Schnitt):
%Vor%Haftungsausschluss - Ich habe momentan keinen Zugriff auf FreeBSD, aber das funktioniert unter OSX bash.
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%Hier ist eine späte Antwort, weil ich gestern auf so etwas gestoßen bin.
Diese Lösung ist:
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.
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%