Datei Dauerhaft durchsuchen
Datei Dauerhaft durchsuchen
Guten Tag Forumgemeinde,
Ich bin auf der suche nach einen Befehl womit ich eine Datei auslesen kann ein Log welche dauerhaft kontrolliert wird wie mit tail -f log.txt und bei einen Bestimmt austauchenden Wort zb befehl:
Alles was rechts von denn Wort befehl: steht in eine Variable schmeist.
zb Bla Bla Bla Befehl: Simon say
b=Simon say
echo $b
#:Simon say
Ich bin auf der suche nach einen Befehl womit ich eine Datei auslesen kann ein Log welche dauerhaft kontrolliert wird wie mit tail -f log.txt und bei einen Bestimmt austauchenden Wort zb befehl:
Alles was rechts von denn Wort befehl: steht in eine Variable schmeist.
zb Bla Bla Bla Befehl: Simon say
b=Simon say
echo $b
#:Simon say
- fragenfrager
- Beiträge: 658
- Registriert: 31.12.2003 08:47:15
Re: Datei Dauerhaft durchsuchen
Bin grad am lernen, deine Aufgabe würde wohl in die Kategorie "Textströme mit Filtern verarbeiten" fallen.
Prinzipiell brauchst du wohl einen Befehl der nach deinem SUCHAUSDRUCK sucht und dann ETWAS macht.
sed wäre so ein Werkzeug. Könnte aber auch ein perl Befehl sein, perl soll da ja sehr mächtig sein glaub ich...
Nur ob es über tail und der stdout geht kann ich abschätzen, da brauchst welche die schon gelehrt sind
Eine Idee wäre vielleicht den Inhalt schon vor der Datei abzufangen, also bereits wenns reingeschrieben werden soll.
Prinzipiell brauchst du wohl einen Befehl der nach deinem SUCHAUSDRUCK sucht und dann ETWAS macht.
sed wäre so ein Werkzeug. Könnte aber auch ein perl Befehl sein, perl soll da ja sehr mächtig sein glaub ich...
Nur ob es über tail und der stdout geht kann ich abschätzen, da brauchst welche die schon gelehrt sind
Eine Idee wäre vielleicht den Inhalt schon vor der Datei abzufangen, also bereits wenns reingeschrieben werden soll.
-
- Beiträge: 3799
- Registriert: 26.02.2009 14:35:56
Re: Datei Dauerhaft durchsuchen
Ich hab mir für sowas logwatch geschrieben - ich meine, was analoges gibt es auch in Debian.
Mein Teil sucht auch strings und kann abhängig davon, welcher gefunden wurde, eine Aktion auslösen. Ich stell mal hier den Quelltext rein - die Libpferd brauchst du nur für den File-Io - kann man auch mit fgets machen. Nonewline entsorgt nur das Zeilenende und könnte mit ner while-Schleife gemacht werden.
Das Teil arbeitet wie tail -f - wenn am Dateiende, dann warten wir und
schauen ob was dazugekommen ist. Es wird also eine Logdatei oder was auch immer permanent überwacht. Damit kann ich dann z. B aus Hercules und dem darauf laufenden MVS 3.8 Lochkarten stanzen und die Lochkartendatei überwachen und so z. B Mails aus ner S/370 verschicken usw usw.
config-Datei dazu hab ich leider nicht hier ist aber
suchstring1=/usr/bin/irgendwas
suchstring2=/usr/bin/nochwas
usw...
Mein Teil sucht auch strings und kann abhängig davon, welcher gefunden wurde, eine Aktion auslösen. Ich stell mal hier den Quelltext rein - die Libpferd brauchst du nur für den File-Io - kann man auch mit fgets machen. Nonewline entsorgt nur das Zeilenende und könnte mit ner while-Schleife gemacht werden.
Das Teil arbeitet wie tail -f - wenn am Dateiende, dann warten wir und
schauen ob was dazugekommen ist. Es wird also eine Logdatei oder was auch immer permanent überwacht. Damit kann ich dann z. B aus Hercules und dem darauf laufenden MVS 3.8 Lochkarten stanzen und die Lochkartendatei überwachen und so z. B Mails aus ner S/370 verschicken usw usw.
config-Datei dazu hab ich leider nicht hier ist aber
suchstring1=/usr/bin/irgendwas
suchstring2=/usr/bin/nochwas
usw...
Code: Alles auswählen
#include <stdio.h>
#include <string.h>
#include <libpferd.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
/* changes */
/* change am 18.10.2011 - Eingau cm= fuer die Schnittstelle */
/* mvs 3.8 unter Hercules an Linux zwecks Ausfuehren von */
/* Linux-Befehlen aus MVS 3.8 */
/* change am 19.10.2011 - Fortsetzungszeilen fuer Lochkarten */
/* aus MVS 3.8 - hier muss in Stelle 72 ein + stehen, damit */
/* die naechste Karte einfach an den Systembefehl angehaengt */
/* wird */
/* Dateidefinition */
FILE *eingabe;
FILE *params;
char esatz[4096];
int rc = 0;
int iein = 0;
int sprint = 0;
long filepos = 0;
char datei[256];
char parmdat[256];
char udatum[] = __DATE__;
char uzeit[] = __TIME__;
char filter[1000] [100];
int ifilter;
char aktion[1000][100];
int pid;
char *pointer = NULL;
/* upros */
void progende(void);
void parmles(void);
void filtern(void);
void befehl(void);
/* hier gehts los */
void filtern(void) {
int itab;
char befehl[1024];
char such[512];
itab = 0;
if (sprint < 1) return;
loop:
strcpy(such,filter[itab]);
if (strstr(esatz,such) == NULL) goto nichtgefunden;
strcpy(befehl,aktion[itab]);
nonewline((char *) befehl);
system(befehl);
nichtgefunden:
itab = itab + 1;
if (itab >= ifilter) goto endloop;
goto loop;
endloop:
return;
}
/* parameter einlesen */
void parmles(void) {
int iein;
int bytes;
char workfeld1 [512];
char workfeld2 [512];
char xbyte;
params = fopen(parmdat,"r");
if (params == NULL) {
printf("Open parmdat dumm gelaufe\n");
exit(1);
}
iein = 0;
lesparm:
bytes = readhigh(512, params, (char *) &workfeld1);
nonewline((char *) &workfeld1);
if (bytes <= 1) goto endles; // ende erreicht
/* pruefung auf kommentar */
if (workfeld1[0] == '#') goto lesparm; // kommentare ueberlesen
xbyte = '=';
unstring((char *) &workfeld1, (char *) &xbyte, (char *) &workfeld2);
printf("%s%s%s\n",workfeld1," =====> ", workfeld2);
strcpy(filter[iein],workfeld1);
strcpy(aktion[iein],workfeld2);
iein = iein + 1;
ifilter = ifilter + 1;
goto lesparm;
endles:
fclose(params);
printf("%s%i\n","Anzahl Filtereintraege: ",ifilter);
return;
}
int main( int argc, char *argv[] )
{
printf("RZ der Pferdefreunde Lindheim - Logwatch\n");
printf("Logwatch - Version 0.2\n");
printf("%s%s%s%s\n","Umandlumg am ",udatum,"-", uzeit);
if (argc != 3) {
printf("Bitte Programm mit 2 Parametern starten\n");
printf("1. Parameter - zu ueberwachende Datei\n");
printf("2. Parameter - Kontrolldatei\n");
progende();
}
pid = fork();
if (pid > 0) exit(0);
strcpy(datei,argv[1]);
strcpy(parmdat,argv[2]);
printf("%s%s\n","Ueberwacht wird: ",datei);
printf("%s%s\n","Kontrolldatei : ",parmdat);
/* oeffnen der Dateien */
eingabe = fopen(datei,"r");
perror ("Open Input Eingabe");
if (eingabe == NULL) {
printf("Open Eingabe dumm gelaufe\n");
exit(1);
}
signal(SIGINT,(void *) progende);
signal(SIGTERM,(void *) progende);
parmles(); //einlesen Parameter fuer das Filtern
/* und nun schicken wir ihn als Daemon in den Hintergrund */
pointer = getenv("logwatch");
if (pointer != NULL) {
printf ("Datei wird ab Beginn abgearbeitet\n");
sprint = 1;
}
lesen:
rc = readpipe(1250,eingabe, (void *) &esatz);
/* eof-behandlung */
rc = feof(eingabe);
if (rc != 0) {
// printf("%s%d\n","RC EOFSTATUS ",rc);
/* wir warten 3 sekunden , schliessen die Eingabe */
/* oeffnen erneut und positionieren an letzte Stelle */
/* dann geht das Spiel von vorne los */
sleep(3);
sprint = 1;
filepos = ftell(eingabe);
fclose (eingabe);
eingabe = fopen(datei,"r");
rc = fseek(eingabe,filepos,SEEK_SET);
if (rc != 0) {
printf("%s%d\n","RC fseek ",rc);
goto ende;
}
goto lesen;
}
/* fehlerbehandlung */
rc = ferror(eingabe);
if (rc != 0) {
printf("%s%d\n","RC read ",rc);
goto ende;
}
iein = iein + 1;
if (sprint == 1)
{
printf(esatz);
if (strncmp(esatz,"cm=",3) == 0) {
befehl();
}
else {
filtern();
}
}
/* hier haben wir jetzt nen Datensatz */
goto lesen;
ende:
progende();
return 0;
}
void progende(void) {
if (eingabe != NULL) fclose(eingabe);
printf("%s%i\n","Gelesen ",iein);
exit (0);
return;
}
void befehl() {
static char systembefehl[1024];
int rc;
static int em;
if (em == 0) {
strcpy(systembefehl,"");
em = 1;
}
if (esatz[71] == '+') {
printf("%s%s\n","Fortsetzung gewuenscht - kein system....",systembefehl);
esatz[71] = 0;
strcat(systembefehl,esatz+3);
return;
}
else {
strcat(systembefehl,esatz+3);
}
printf(systembefehl);
printf("\n");
rc = system(systembefehl);
printf("%s%i\n","RC = ", rc);
/* nach Ausfuehrung wieder platt machen */
strcpy(systembefehl,"");
return;
}
Re: Datei Dauerhaft durchsuchen
pferdefreund, du kennst nopaste? Sind doch schon > 3 Jahre Mitgliedschaft.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nicht • Don't break debian! • Wie man widerspricht
Windows ist doof, Linux funktioniert nicht • Don't break debian! • Wie man widerspricht
Re: Datei Dauerhaft durchsuchen
Naja, du kannst doch tail -f nehmen:Beachte, dass cmd ein paar Einschraenkungen hat, weil es momentan als RegEx ausgewertet wird. Zum Beispiel wird /cmd nur als \/cmd funktionieren. Wenn du damit irgendwelche Systembefehle ausfuehren willst, wuerde ich das gegen sh pipen.
Gruss Cae
Code: Alles auswählen
$ tail -f file | sed -n '/cmd/{s/^.*?cmd//;p}'
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
-
- Beiträge: 3799
- Registriert: 26.02.2009 14:35:56
Re: Datei Dauerhaft durchsuchen
Ich kenne nopaste - hab leider in der Eile gestern nicht daran gedacht, dachte nicht, das das Progrämmelchen mittlerweile so groß ist.
Hier noch ein Auszug einer entsprechenden Konfig-Datei für das Programm.
abbruch=echo "Dumm gelaufe" | mail -s "Abbruch auf der ITS 1" klaus.schaefer@itscare.de
abbruch=sag de5 "Achtung - Abbruch auf der ITS Eins. Bitte prüfen."
wenn der String abbruch gefunden wird, passieren die rechts vom = stehenden Aktionen. Das mit dem cm= ist eine
spezialfunktion um per Fremdsystem per netcat usw befehle lokal zu starten oder per virtueller Lochkarten vom 40 Jahre
alten MVS aus was zu steuern usw...
Hier noch ein Auszug einer entsprechenden Konfig-Datei für das Programm.
abbruch=echo "Dumm gelaufe" | mail -s "Abbruch auf der ITS 1" klaus.schaefer@itscare.de
abbruch=sag de5 "Achtung - Abbruch auf der ITS Eins. Bitte prüfen."
wenn der String abbruch gefunden wird, passieren die rechts vom = stehenden Aktionen. Das mit dem cm= ist eine
spezialfunktion um per Fremdsystem per netcat usw befehle lokal zu starten oder per virtueller Lochkarten vom 40 Jahre
alten MVS aus was zu steuern usw...
Re: Datei Dauerhaft durchsuchen
Erst mal danke an die Vorschläge´und für den Ausführlichen Script @pferdefreund
Was so in die Richtung geht ist
nur das er es nicht ausschneiden will wollte es mit Cut versuchen was aber nicht darauf anspringt. um eben alles rechts von /cmd zu bekommen
Was so in die Richtung geht ist
Code: Alles auswählen
tail -f file | sed -n '/cmd/{s/^.*?cmd//;p}'
Re: Datei Dauerhaft durchsuchen
Poste die Fehlermeldungen. Wie ich oben schon schrieb, falls du /cmd einsetzen willst (mit Slash vorne dran), wird's ohne Vorsorge kaputt gehen.
Gruss Cae
Gruss Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
Re: Datei Dauerhaft durchsuchen
es gibt keien fehlermeldung Cut ignoriert es einfach komplett wenn ich die ausgabe in einen pipe weiter gebe.