• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Suche Zeile in Text Datei mit bash

Termi11

Newbie
Hallo,
folgendes versuche ich gerade: (mit bash!!, perl usw geht schon)

syslog Datei soll jede Stunde gelesen werden.
Am ende des scriptes soll die letzte Zeile (Zeilennummer) in eine tmp Datei gespeichert werden.
Soweit kein Problem.
Nur wie springe ich am Anfang meines scriptes (beim nächsten Starten) wieder zu dieser Zeile, um von da an weiter zu "lesen".
Ich könnte die letzte Zeile komplett in eine temp Datei speichern, und beim nächsten run nach dieser Zeile suchen, und dann weiter lesen, jedoch würde dies lange dauern, und viel CPU nutzen, da meine Log's wirklich lang sind!!

In perl nehme ich seek

TKS
 
A

Anonymous

Gast
müsste man genau wissen was du als "lesen" bezeichnest, um dir was genau passendes vorzuschlagen.

positionieren kannst du auf der Konsole in Text-Dateien zB mit den Befehlen head und tail
Andere Befehle die speziell für die Bearbeitung solcher Dateien erfunden wurden, führen eine Zeilenvariable mit sich. zB sed und awk

Wenn man ein Buch ließt, merkt man sich die letzte Seitenummer und nicht den Inhalt von der letzten Seite, genauso kann man es hier auch machen und merkt sich zB in einer Datei die letzte Zeilennummer und "ließt" dann ab dieser Zeile weiter. In AWK könnte das zB so hier aussehen (habe es aber nicht ausprobiert, ist nur Braindump)
Code:
awk 'BEGIN {getline ALTEZEILE <"flagdatei"}; NR>=ALTEZEILE {print}; END {print NR >"flagdatei"}' logdatei

  • # es wird die Datei logdatei in diesem Fall hier wird nur ausgegeben (das soll das "lesen" sein)
    # die letzte Zeilennummer wird in der Datei flagdatei gespeichert
    # wird der Befehl wieder ausgeführt wird flagdatei gelesen und der Inhalt in der Variable ALTEZEILE abgelegt
    # gelesen wird nur wenn die aktuelle Zeilennummer der logdatei größer als ALTEZEILE ist
    # ob das jetzt >=ALTEZEILE oder nur >ALTEZEILE sein muss, habe ich jetzt nicht ausprobiert.
    # auch ungetestet ist. was passiert wenn beim ersten Mal die flagdatei noch nicht existiert.

robi
 
OP
T

Termi11

Newbie
Es geht darum:

Ein Tool, welches bei mir auf meinem Server läuft, schreibt dauernd Daten in die Syslog.
Um Statistiken auszuwerten (was leider in diesem Tool nicht geht), lese ich die syslog jede Stunde aus.
Da die syslog aber mehrere MB hat, und auf meinem Via C7 dann doch etwas länger braucht, um jedesmal die komplette syslog zu lesen, suche ich halt die letzte gelesene Zeile (was afaik schneller geht, als wieder jede Zeile lesen, und mit der letzten Zeile des vorherigen run's zu vergleichen ist).
Und von dieser Zeile+1 lese ich dann wieder bis zum Schluss, und werte die Stat's aus.

Perl möchte ich nicht mehr nutzten, bzw will's in bash lernen, da ich in etwa einem Monat nen Examen hab, und mich so vorbereite ;-)

Aber die awk Zeile scheint genau das zu sein was ich suche, wusste nicht dass mit awk solche Sachen machbar sind ;-)

BESTEN DANK!!
 

abgdf

Guru
Ok, aber ob awk noch bash ist oder wiederum eine eigene Sprache, daß kann man natürlich so oder so sehen ...

Gruß
 
A

Anonymous

Gast
Termi11 schrieb:
wusste nicht dass mit awk solche Sachen machbar sind ;-)

AWK und SED sind älter als viele heute gebräuchlicher Hochsprachen, Shellbuildins und älter als die meisten Optionen der heute gebräuchlichsten Filterfilterkommandos. Vor den heute üblichen Tabellenkalkulationen, Datenbanken, Textprozessoren da haben awk und sed und andere (heute vergessene) schon die Hauptlast bestimmter Teillbereiche der Datenverarbeitung übernommen. Bei typischen Text, Listen, Tabellen uA geht damit vielleicht nicht ganz alles, aber eine ganze Menge mehr als man auf den ersten Blick vermutet, und oftmals recht einfach und effizient.

echtes Shell ist es natürlich nicht, doch was ist schon Shell wenn man damit keine Kommandos ausführen will. ;) ;) ;) ;)

robi
 
Oben