Datei Dauerhaft durchsuchen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Datei Dauerhaft durchsuchen

Beitrag von Nokman » 30.01.2014 09:29:23

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

Benutzeravatar
fragenfrager
Beiträge: 658
Registriert: 31.12.2003 08:47:15

Re: Datei Dauerhaft durchsuchen

Beitrag von fragenfrager » 30.01.2014 15:23:32

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.
Debiansed 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.

pferdefreund
Beiträge: 3799
Registriert: 26.02.2009 14:35:56

Re: Datei Dauerhaft durchsuchen

Beitrag von pferdefreund » 30.01.2014 19:36:24

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...

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;
}



Benutzeravatar
TRex
Moderator
Beiträge: 8322
Registriert: 23.11.2006 12:23:54
Wohnort: KA

Re: Datei Dauerhaft durchsuchen

Beitrag von TRex » 30.01.2014 21:30:12

pferdefreund, du kennst nopaste? Sind doch schon > 3 Jahre Mitgliedschaft.
Jesus saves. Buddha does incremental backups.
Windows ist doof, Linux funktioniert nichtDon't break debian!Wie man widerspricht

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Datei Dauerhaft durchsuchen

Beitrag von Cae » 31.01.2014 01:20:44

Naja, du kannst doch tail -f nehmen:

Code: Alles auswählen

$ tail -f file | sed -n '/cmd/{s/^.*?cmd//;p}'
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
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

pferdefreund
Beiträge: 3799
Registriert: 26.02.2009 14:35:56

Re: Datei Dauerhaft durchsuchen

Beitrag von pferdefreund » 31.01.2014 09:56:51

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...

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Datei Dauerhaft durchsuchen

Beitrag von Nokman » 01.02.2014 22:09:24

Erst mal danke an die Vorschläge´und für den Ausführlichen Script ;) @pferdefreund

Was so in die Richtung geht ist

Code: Alles auswählen

tail -f file | sed -n '/cmd/{s/^.*?cmd//;p}'
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

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Datei Dauerhaft durchsuchen

Beitrag von Cae » 02.02.2014 00:23:12

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
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

Nokman
Beiträge: 146
Registriert: 02.09.2006 01:44:31

Re: Datei Dauerhaft durchsuchen

Beitrag von Nokman » 02.02.2014 11:15:54

es gibt keien fehlermeldung Cut ignoriert es einfach komplett wenn ich die ausgabe in einen pipe weiter gebe.

Antworten