Gibt es eine Möglichkeit, die erste zu entfernen N
Zeilen aus einem Protokoll, das von einer Anwendung aktiv angehängt wird?
Nein, Betriebssysteme wie Linux und ihre Dateisysteme bieten keine Möglichkeit, Daten vom Anfang einer Datei zu entfernen. Mit anderen Worten, der Startpunkt für die Speicherung einer Datei ist festgelegt.
Das Entfernen von Zeilen vom Anfang einer Datei wird normalerweise durch Schreiben der verbleibenden Daten in eine neue Datei und Löschen der alten erreicht. Wenn die alte Datei in einem Programm zum Schreiben geöffnet ist, wird die Löschung dieser Datei verschoben, bis die Anwendung die Datei schließt.
Wie die Kommentatoren bemerkt haben, müssen Sie aus den Gründen, die ich in meinem vorherigen Satz angegeben habe, in der Regel die Protokolldatei-Bereinigung mit den Programmen koordinieren, die die Protokolle schreiben. Wie Sie das genau machen, hängt von den Programmen ab. Einige Programme schließen ihre Protokolldateien und öffnen sie erneut, wenn Sie ihnen ein Signal senden (z. B. HUP). Dies kann verwendet werden, um zu verhindern, dass Protokollsätze in eine gelöschte Protokolldatei geschrieben werden, ohne den Dienst zu stören.
Es stehen viele Dienstprogramme zur Verfügung, um beispielsweise die Größe von Protokolldateien zu verwalten logrotieren
Einige Programme haben eigene Dienstprogramme. Zum Beispiel enthält der Apache-Webserver eine Rotatelogs Nützlichkeit.
Ich denke, diese Aufgabe kann mit erreicht werden
sed
würde die Zeilen von 1 entfernen st zu den 10 th Linie bilden die Datei.
Ich denke, jeder sollte sich wenigstens einen Blick darauf werfen dies sed 1 Liner .
Beachten Sie, dass dies nicht für Protokolldateien funktioniert, die von einer Anwendung aktiv angefügt werden (wie in der Frage angegeben).
sed -i
erstellt eine neue Datei und "löscht" die Datei, in die geschrieben wird. Die meisten Anwendungen schreiben weiterhin Protokollsätze in die gelöschte Protokolldatei und füllen den Festplattenspeicher weiterhin aus. Die neue, abgeschnittene Protokolldatei wird nicht angehängt. Dies wird nur beendet, wenn die Anwendung neu gestartet wird oder auf andere Weise signalisiert wird, die Protokolldateien zu schließen und erneut zu öffnen. Ab diesem Zeitpunkt wird in der neuen Protokolldatei eine Lücke (fehlende Protokollsätze) angezeigt, wenn zwischen der Verwendung von sed und dem Neustart der Anwendung protokollierbare Aktivität aufgetreten ist.Ein sicherer Weg, dies zu tun, wäre, die Anwendung anzuhalten, das Protokoll mit sed zu kürzen und die Anwendung anschließend neu zu starten. Dieser Ansatz kann für einige Dienste nicht akzeptabel sein (z. B. für einen Webserver mit hohem Durchsatz und hohen Anforderungen an die Dienstkontinuität).
quelle
sed '1,10d' myfile > myfile.new
. Verbringen Sie einfach ein paar Stunden, um zu verstehen, wie Sed funktioniert. Das ist es wert. :)sed -i
schafft ein neue Datei Der bearbeitete Inhalt wird entfernt und der alte wird entfernt, sodass Sie die aktive Datei nicht bearbeiten:$ ls -i --- 6823554 testfile --- $ sed -i 's/test/final/' testfile --- $ ls -i --- 6823560 testfile
------ Bitte überprüfen Sie, wie es gehtsed -i
Arbeit. Warum hat diese falsche Antwort so viele Upvotes?Nein. Eine Lösung für dieses generische Problem beim Wachstum von Protokolldateien ist die Protokollrotation. Dies betrifft die Regelmäßig (nachts oder wöchentlich, normalerweise) Verschieben einer vorhandenen Protokolldatei in einen anderen Dateinamen und neuer Start mit einer leeren Protokolldatei. Nach einiger Zeit werden die alten Protokolldateien weggeworfen.
Sehen: http://www-uxsup.csx.cam.ac.uk/~jw35/courses/apache/html/x1670.htm
quelle
Vielleicht kopieren, kürzen, die Kopie wieder auf die Größe = 0 kürzen und die Kopie löschen?
Noch besser ist es, Tail to Tail zu kopieren, das Original und das Concat Tail Copy auf das Original zu kürzen.
Sie erhalten Zeilen im Protokoll bei Tail Length, also besser als eine Bytelängenbegrenzung.
quelle