kleines Script um Datei auszulesen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
=Jägermeister=
Beiträge: 106
Registriert: 19.01.2006 16:14:28

kleines Script um Datei auszulesen

Beitrag von =Jägermeister= » 28.04.2006 15:13:14

Hallo,
ich muss leider gestehen das ich sogut wie gar keine Ahunung vom Scripten habe.

Jetzt komm ich wohl aber nicht drum rum eins selbst zu schreiben :(

Ich habe den Kaspersky Virenscanner auf einem Mailserver laufen. Dort läuft alle 3 Stunden ein cron-job der nach Updates sucht. Updates werden auch von Kaspersky so schnell aktualiersiert das der alle 3 Stunden was "neues" findet.

So ich hätte jetzt gerne eine tägliche Email von dem Server ob ein Update erfolgreich gemacht wurde.
Kaspersky selber bietet leider nicht eine solche Funktion.

So meine Idee ist daher eine log Datei auszulesen. Die Update-Funktion besitzt nämlich eine eigene.

Ein erfolgreiches Update wird wie folgt aufgezeichnet :

Code: Alles auswählen

[28/04/06 12:00:03 E] Published: ev_type = 'UPD_UpdateVersion'
        Params: 'Ver' = 1146232260

Fehler können unterschiedlich aussehen, z.B.:

Code: Alles auswählen

[20/04/06 00:00:08 E] Failed to create dir /tmp/k3K001m00006408/1136/
so mein Gedanke ist jetzt irgendwie immer die letzte Zeile auszulesen mit einem Script und erst mal zu überprüfen ob es erfolgreich war (das sollte ja gehn weil die Zeile ja immer gleich ist)...sollte das nicht der Fall sein das sofort eine Mail kommt mit entsprechendem hinweiß
Beinhaltet die letzte Zeile jedoch ein erfolgreiches Update sollte noch das Datum mit der aktuellen Systemzeit verglichen werden um sicherzugehen das es auch ein aktuelles Update war.

So das einzigste was ich mim Moment dazu weiß ist wie ich mir eine Mail schreibe.

Code: Alles auswählen

echo " " | mail -s "Update erfolgreich" adresse@domain.de
Ich bin mir sicher das das ganze sicherlich mit ein paar Zeilchen zu machen ist. Wüsste jedoch nicht wie ich anfangen sollte.
Könnte mir jemand vielleicht ein bisschen helfen ?

Benutzeravatar
seep
Beiträge: 544
Registriert: 31.10.2004 14:21:08
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: HSK

Beitrag von seep » 28.04.2006 16:23:21

Hier ein paar Tipps, programmieren mußt Du noch selber, macht aber Spaß. :wink:

1. Die letzte Zeile einer Textdatei erhälst Du mit

Code: Alles auswählen

tail -1 datei.txt
2. Ob in einem Text ein bestimmter Suchtext vorhanden ist, kannst Du am Rückgabewert von grep ermitteln.

Code: Alles auswählen

echo $LetzteZeile | grep "suchbegriff"
rc=$?
3. Mit "test" führst Du eine Überprüfung durch (siehe man test). Die geöffnete eckige Klammer ist eine Abkürzung für diesen Befehl:

Code: Alles auswählen

if [ $rc == 0 ]; then
    schickeEineMail()
else
   macheEtwasAnderes()
fi
Viel Spaß beim Basteln.

=Jägermeister=
Beiträge: 106
Registriert: 19.01.2006 16:14:28

Beitrag von =Jägermeister= » 08.05.2006 11:02:43

habs hinbekommen......danke für deine tipps!

=Jägermeister=
Beiträge: 106
Registriert: 19.01.2006 16:14:28

Beitrag von =Jägermeister= » 11.05.2006 09:57:49

so jetzt bin ich am nächsten script und habe folgendes problem:

ich habe eine datei mit ganze vielen email-adressen, pro zeile eine adresse

jetzt möchte ich bestimmte adressen per script auskommentieren.
sprich irgendwo in der langen liste existiert die adresse asdf@test.de , dann soll nach aufruf des scriptes automatisch ein # vor diese zeile gesetzt werden.

ideal wäre es natürlich noch wenn ich in einer zweiten datei die wenigen adressen pflegen könnte die auskommentiert werden sollen, und das das script diese dann ausließt und sich aus der anderen gezielt diese adressen raussucht und dann diese auskommentiert.

also das auslesen der einen datei bekomm ich denke hin aber ich hab gerad keine idee wie ich genau die eine zeile finde und die dann auskommentiere, könnte mir jemand da en tip geben ?

dannnge !

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Beitrag von roli » 11.05.2006 11:23:19

Hi,

fuer den Job bieten sich sed, awk und perl an.
Damit kann man nach Zeichenketten suchen, und diese durch "was du willst" ersetzen. In deinem Fall slao duch "sich selbst" plus einem Hash davor.
Wenn du mehr Info brauchst, frag einfach weiter.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 11.05.2006 13:40:31

Als sed-Einzeiler:

Code: Alles auswählen

sed '/foo@bar.de/ s/^/#/' Datei > NeueDatei
# oder die Datei direkt ändern (geht nur bei neuen seds)
sed '/foo@bar.de/ s/^/#/' -i Datei

ToPeG
Beiträge: 437
Registriert: 14.04.2004 00:42:06

Beitrag von ToPeG » 11.05.2006 14:08:11

Dein Problem als Perlscript. :-)

Code: Alles auswählen

#!/usr/bin/perl

use strict;

my $infile=shift(@ARGV);
my $rmfile=shift(@ARGV);
my $komment=shift(@ARGV);

$komment='#' if($komment eq '');

hilfe() if($infile eq '' or $rmfile eq '');

open(IN,'<',$infile) or err_lesen($infile,$!);
my @l_in=<IN>;
close(IN);

open(IN,'<',$rmfile) or err_lesen($rmfile,$!);
my @l_rm=<IN>;
close(IN);
map{chomp($_)}@l_rm;

open(OUT,'>',$infile) or err_schreiben($infile,$!);
for my $zeile (@l_in)
{
 if(grep{$zeile=~m/^$_$/}@l_rm)
 { print OUT $komment.$zeile; }
 else
 { print OUT $zeile; }
}
close(OUT);
exit(0);

sub err_schreiben($$)
{ die "Konnte \"$_[0]\" nicht schreiben ($_[1])\n"; }

sub err_lesen($$)
{ die "Konnte \"$_[0]\" nicht lesen ($_[1])\n"; }

sub hilfe()
{
 die <<TPG;
nicht genügend Argumente!
Aufruf:
 $0 /pfad/zur/liste /pfad/zur/referenzliste [kommentarzeichen] 

Dises Script kommentiert mit einer #,
oder einem andern Zeichen wenn gesetzt,
in der ersten Liste all jene Zeilen aus,
die in der zweiten Liste stehen.
Es können auch Reguläre Ausdrücke
in der Perlsyntax verwendet werden
TPG
}

Benutzeravatar
seep
Beiträge: 544
Registriert: 31.10.2004 14:21:08
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: HSK

Beitrag von seep » 12.05.2006 07:41:06

=Jägermeister= hat geschrieben:ideal wäre es natürlich noch wenn ich in einer zweiten datei die wenigen adressen pflegen könnte die auskommentiert werden sollen, und das das script diese dann ausließt und sich aus der anderen gezielt diese adressen raussucht und dann diese auskommentiert.
Ich würde da zu bash und sed greifen. Mit einem Bash-Script erzeugst Du aus Deiner Datei mit den auszukommentierenden Adressen ein Include-File für den sed und rufst dann anschließend den sed mit der Option -f auf. In etwa so:

Code: Alles auswählen

$ cat auskommentieren.lst
foo@bar.com
hello@world.com
blah@fasel.de

$ cat auskommentieren.sh
#!/usr/bin/bash

LSTFILE="auskommentieren.lst"
SEDFILE="auskommentieren.sed"
OUTFILE="ausgabe.lst"
INFILE="eingabe.lst"

if [ -f $SEDFILE ]; then
  rm $SEDFILE
fi

cat LSTFILE | while read ADDR
do
    echo "s/^$ADDR/# $ADDR/" >> $SEDFILE
done

sed -f $SEDFILE < $INFILE > $OUTFILE
Es schreibt also für alle auszukommentierenden Adressen eine Suchen/Ersetzen-Regel ins SEDFILE (das vorher falls vorhanden gelöscht wird) und ruft anschließend den sed auf, um die ganzen Regeln in einem Rutsch auf die ganze Eingabedatei loszulassen, das Ergebnis landet dann im Outfile.

edit: :idea: Fällt mir gerade auf: Man kann natürlich auch mit dem sed aus der auskommentieren.lst die auskommentieren.sed erstellen und spart sich die if- und while-Schleife oben. Aber so wie oben ist es für Scriptneulinge wohl eher durchschaubar, was da passiert.

Antworten