www.bimminger.at

Tipps / Linux

Linux

Große Log-Files splitten bzw. teilen


Log-Files wie z.B. die Datei access_log vom Apache Server können oft ganz schön groß sein. Will man diese Files laufend betrachten oder mit ihnen arbeiten, sollte man sich doch vielleicht mal überlegen ob man die Dateien nicht in mehrere Teile aufteilt (splitten). Zwei Vorgangsweisen hab ich hier aufgeführt.

vi


Sollte die Datei noch nicht zu groß sein und wenn man gerne mit vi arbeitet, dann kann man z.b. einen zu groß geratenen access_log mit wenig Aufwand zerteilen.

:1,13814w access_log2002
:0
:d13814


Mit dem ":" kommt man immer zur Befehlseingabe. Die erste Zeile hat folgende Aussage: Zeile 1-13814 soll in die Datei access_log2002 gesichert werden. Mit :0 kommt man zur ersten Zeile und von da kann man mit :d13814 bis zur Zeile 13814 alle Zeilen löschen. vi kann natürlich auch von außen gesteuert werden:

vi -c "1,13814w access_log2002" access_log

Nähere Informationen zu vi bitte dem Manual zu entnehmen.

split


Statt den vi zu bemühen kann man natürlich auch das Kommandozeilentool split verwenden. Mit der Anweisung

split -l 1000 access_log split_

kann man eine Datei in mehrere Log-Dateiein zu jeweils 1000 Zeilen aufteilen. Die Dateien erhalten dann den Namen split_aa, split_ab, ... oder split_01, split_02, ... (Je nach verwendeter Version). Eine weitere Vorgehensweise wäre mit csplit möglich, hier können auch Muster als Trennpunkte verwendet werden.
Nachdem Robert mal über diese Seite gelesen hat, hat er mir diesen Tipp zu split und csplit verraten. Darum gleich an dieser Stelle: Danke!

sed


Wenn die Log-Files aber zu groß werden wird man mit dem vi nicht mehr sehr weit kommen. Denn im Bearbeitungsmodus kann eine 700MB Datei schon einmal alle System-Ressourcen für sich beanspruchen und an ein flüßiges arbeiten ist fast nicht mehr zu denken. Hier gibt es mit dem Streaming-Editor ein sinnvolles Tool um das Splitten zu bewerkstelligen.
Zuerst kann man sich eine bestimmte Zeile suchen bei der man splitten möchte. Mit folgendem Befehl kann man sich eine bestimmte Zeile ausgeben lassen.

sed -n 13814l access_log


Wenn die Zeile gefunden ist ab wo geteilt werden soll, dann braucht man nur noch folgende Anweisungen zu starten:

sed -n "1,13814w access_log2002" access_log
sed 1,13814d access_log > access_log_new
cp access_log_new access_log


Mit der ersten Zeile werden die ersten 13814 Zeilen aus access_log in access_log2002 gesichert. Dann werden aus access_log die ersten 13814 Zeilen entfernt und der Rest in access_log_new gespeichert. Mit cp access_log_new access_log wird der alte Log-File mit dem gekürzten Log-File überschrieben.


Um einen Diskussionsbeitrag zu posten müssen Sie eingeloggt sein.