script um logfile zu monitoren/anzupassen

L

likwitt

Jungspund
Hallo zusammen,

ich hoffe hier kann mir jemand helfen:-)
Folgendes Problem.
Ich benötige ein script (perl), mit dem ich bestimmte logfiles "überwachen" kann, um daraufhin bestimmte Werte lösche.
Als Beispiel -->
Ich habe ein test.log mit folgenden Zeilen:

1. Text Text kshddhez : 123 : Name :root
2. Text Text kksdhhdwi : 92383 : Name :user1
3. Text Text öladjwlkdnd : 123 : Name :root
4. ....... Name: user3
... ...

jedesmal wenn ein neuer Eintrag in das logfile kommt, sollen die Namen (bzw. alles hinter "Name :") gelöscht werden.
mit
sed 's/'SUCHE'/'ERSETZE'/g' *
kann ich bestimmte Werte ersetzten,aber wie lautet der Befehl um nach einem Bestimmten String (Name :) den Rest der Zeile zu löschen?

Ich hoffe Ihr könnt mir hier weiterhelfen :-)!

thx schonmal für Tipps & links:-)
 
Moin,

bin ja absolut kein sed Fan aber auf die schnelle:
Code:
$ cat dummyfile
test test test:123:Name:root
zwei zwei zewei:12345:Name:user1
drei vier fünf:123:Name:root
$ cat dummyfile | sed 's/:Name:.*$/:Name:/g'
test test test:123:Name:
zwei zwei zewei:12345:Name:
drei vier fünf:123:Name:

Wobei es aber meines erachtens der elegantere Weg das Logging so zu ändern das der Name nicht mit Protokoliert wird.

mfg
HeadCrash
 
Zuletzt bearbeitet:
danke für die Antwort.
ich hatte mir das in etwa so gedacht
PHP:
sed "s/\(.* : Name :\).*/\1/" file1

aber leider klappt das auch nicht ganz:-(
bei deinem Beispiel wird die Leerstelle nicht berücksichtigt.

Habe ich wohl leider nicht richtig Beschrieben, sorry.

PHP:
$ cat dummyfile
test test Name test:123:Name ist:root
zwei ist zwei z Name ewei:12345:Name ist:user1
drei ist vier name fünf:123:Name ist:root

Wie müsste hier dein sed lauten?
$ cat dummyfile | sed 's/:Name ist:.*$/:Name ist:/g'

klappt leider nicht. Aber finde nicht wie ich "zwei aneinandere gereite Wörter ersetzen kann.

Dann zum zweiten Problem - eventuell hier eine idee, wie man regelmässig den timestamp auf leichte weise überprüfen kann?
Momentaner Ansatz wäre
Schritt 1. den funktionierenden sed durchführen, und cp des "bereinigten files".
Schritt 2. "bereinigtes file" als "vergleich" nutzten
PHP:
if [ bereinigtes file -nt .neuesfile ]; then sed & cp
Wäre dies ein möglicher ansatz?
thx
 
Musst das Leerzeichen escapen

Code:
$ cat dummyfile | sed 's/:Name\ ist:.*$/:Name\ ist:/g'
test test test:123:Name ist:
zwei zwei zewei:12345:Name ist:
drei vier fünf:123:Name ist:

EDIT:
die Version wie du es machen wolltest:

Code:
$ cat dummyfile | sed 's/^\(.*:Name\ ist:\).*$/\1/g'
test test test:123:Name ist:
zwei zwei zewei:12345:Name ist:
drei vier fünf:123:Name ist:
 
Zuletzt bearbeitet:
Thx!!!!! --> klappt beides nun wunderbar:-))
somit eigentlich egal welches ich zum bereinigen nutze.
hätte wohl ewig gesucht bis ich den Fehler gefunden hätte:-)

eventuell noch ne Idee zu dem timestamp:-)?
oder wäre die Lösung mit dem filevergleich denkbar? (wobei ich hier ja einen cronjob benötigen würde der dies regelmässig vergleicht?)
 
Ich weiß gar nicht ob du da großartig mit Timestamps arbeiten musst, oder einfach per Cron alle Stunde das Logfile durch sed jagen. Kommt darauf an wie groß das Logfile an der Stelle ist.

Ansonsten ist deine Idee mit "-nt" sicherlich das einfachste, da es nur dann durch das Logfile rennt wenn sich wirklich was getan hat.
Code:
[ logfile -nt bereinites.logfile ] && sed logfile > bereinigtes.logfile

Sed arbeitet in jedem Fall das komplette Log durch.
 
hmm. ich habe mehrere files dummydatum1 dummydatum2 usw., in denen der Namen bereinigt werden müsste.
dann wäre wohl der cronjob eher das richtige?
--> fällt mir gerade auf dass die Lösung mit dem Vergleich nicht wirklich geht, da sich der Filenamen aufgrund des Datums eh ständig ändert:-(

bleibt quasi ein grep auf dummy*.log der mir die logfiles aufliststet , in denen "Name ist :" vorkommt. und auf diese *.log´s dann das sed?

Code:
grep "Name ist :" *.log
gibt mir ja alle Zeilen aus in denen der gesuchte string vorkommt.
Mich intressieren allerdings nur die logfiles ansich.
Wie verknüpfe ich dann das sed auf die verschiednene logs müsste mit | gehen?

Hmmm - selbst simple sachen scheinen mir ein Rätsel:-)? Wenn man sogut wie nie was scripten muß, dann ist man ewig auf Fehlersuche:-(



oder wäre auch soetwas denkbar
Code:
cat dummyfile*.log | sed 's/^\(.*:Name\ ist:\).*$/\1/g'
müsste eigentlich gehn --> geht:-)!
Allerdings, wie stelle ich sicher das inputfilename = outputfilename ist? sind ja mehrere

bin nur nicht mit der cron lösung so wirklich zufrieden:-(
Perl mit sleep wäre hier doch auch denkbar?,
bezw. genauer gefragt - wie würde das perlscript aussehen, wenn ich den sed - befehl alle x Sec //sleep x sec// ausführen möchte??

**********************
**********************
Problem gelöst:
dachte ich schreib das zumindest hier rein, bevor sich jemand die Mühe macht:-)
Eventuel hat ja jemand mal ein ähnliches Problem.
Habe das ganze mit einem shell script "gelöst"

Code:
#!/bin/sh
#du zu bereinigenden Files definieren
File1=/Pfad/dummy1.log
File2=/Pfad/dummy2.log

while :
 do
   cat "$File1" | sed 's/^\(.*Name\ ist\).*$/\1/g' > /var/tmp/Filetmp1
   cat "$File2" | sed 's/^\(.*Name\ ist\).*$/\1/g' > /var/tmp/Filetmp2

  mv /var/tmp/Filetmp1 "$File1"
  mv /var/tmp/Filetmp2 "$File2"
#chown user:gruppe "$File1" "$File2"
 
sleep 15;
done

Das ganze wird dann über ein anderes script im hintergrund gestartet (start/stop/status/restart).
 
Zuletzt bearbeitet:

Ähnliche Themen

[Tcl / Shell] Ändern einer Datei per vi - Änderungsdatum einer Datei erfassen

Perl Script zur überwachung fon logfils.

Amavis & Benachrichtigungen

Server-Monitoring mit RRDTool

Zurück
Oben