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

Einen bestimmten String suchen in einem LOG - File

Hallo Forum,

ich möchte nach einem bestimmten String suchen in einem LOG - File.
Wobei die letzten 200 Zeilen des LOG - Files durchsucht werden sollen.
Jetzt soll ein bestimmter String gesucht werden und wenn dieser auftaucht soll aber noch gleichzeitig die nächsten paar Zeilen beobachtet werden.

Der Grund ist jener, dass nach der Error - Fehlermeldung oft die Verbindung später aufgebaut wird, somit der Error nichtig wird !

Ich möchte also die letzten 200 Zeilen nach dem Error absuchen und dann vll die nächsten 5 - 10 Zeilen od so schauen, ob nicht doch ein 1 users connected aufscheint ( Der User connect muss nicht zwangsweise sofort in der nächsten Zeile auftauchen, könnte auch erst in den nächsten 5 - 10 Zeilen vll sein !! )!

Kann mir jemand vll einen Tipp geben, wie ich es hinbekommen könnte, entweder Shell - Script od Perl - Script ?

Danke vielmals

Das Log - File sieht so aus:



  • Mar 4 09:02:56.07009 orc2 sebprod[26982:t@144 ]/info: [orcserver] -
    User connected from [10.117.212.38:1406]
    Mar 4 09:03:01.91863 orc2 sebprod[26982:t@144 ]/info:
    [orcserver:pEE:cdsprod@orc1] - Connect done OK [PEE:cdsprod@orc1].
    Mar 4 09:03:01.91879 orc2 sebprod[26982:t@144 ]/info:
    [user:pEE:cdsprod@orc1] - [Orc version 6.1 build 15]: Logged in.
    Mar 4 12:59:20.83352 orc2 sebprod[26982:t@1061 ]/info: [orcserver] -
    User connected from [10.117.212.21:1675]
    Mar 4 12:59:20.84020 orc2 sebprod[26982:t@1061 ]/info:
    [orcserver:MWY:cdsprod@orc1] - Connect done OK [MWY:cdsprod@orc1].
    Mar 4 12:59:20.84026 orc2 sebprod[26982:t@1061 ]/info:
    [user:MWY:cdsprod@orc1] - [Orc version 6.1 build 15]: Logged in.
    Mar 4 13:41:28.28321 orc2 sebprod[26982:t@1226 ]/info: [orcserver] -
    User connected from [10.117.211.128:1336]
    Mar 4 13:41:31.29730 orc2 sebprod[26982:t@1226 ]/info:
    [orcserver:johan:cdsprod@orc1] - Connect done OK [johan:cdsprod@orc1].
    Mar 4 13:41:31.29738 orc2 sebprod[26982:t@1226 ]/info:
    [user:johan:cdsprod@orc1] - [Orc version 6.1 build 15]: Logged in.
    Mar 4 16:06:41.90583 orc2 sebprod[26982:t@1226 ]/info:
    [orcserver:johan:cdsprod@orc1] - Logout requested.
    Mar 4 16:06:41.90590 orc2 sebprod[26982:t@1226 ]/info:
    [user:johan:cdsprod@orc1] - Logging out.
    Mar 4 16:06:41.97297 orc2 sebprod[26982:t@1226 ]/info:
    [orcserver:johan:cdsprod@orc1] - Removed user (2 users connected).
    Mar 4 16:51:36.17540 orc2 sebprod[26982:t@1061 ]/error:
    [orcserver:MWY:cdsprod@orc1] - Read failed [-1][Read error].

    Mar 4 16:51:36.28029 orc2 sebprod[26982:t@1061 ]/info:
    [orcserver:MWY:cdsprod@orc1] - Removed user (1 users connected).

    Mar 4 16:52:54.97574 orc2 sebprod[26982:t@1969 ]/info: [orcserver] -
    User connected from [10.117.212.21:2045]
    Mar 4 16:52:57.44457 orc2 sebprod[26982:t@1969 ]/info:
    [orcserver:MWY:cdsprod@orc1] - Connect done OK [MWY:cdsprod@orc1].
    Mar 4 16:52:57.44464 orc2 sebprod[26982:t@1969 ]/info:
    [user:MWY:cdsprod@orc1] - [Orc version 6.1 build 15]: Logged in.
    Mar 4 20:00:06.40275 orc2 sebprod[26982:t@2 ]/info: [orcserver] -
    Terminating [SIGINT/SIGTERM]...
    Mar 4 20:00:06.71048 orc2 sebprod[26982:t@144 ]/warn:
    [orcserver:pEE:cdsprod@orc1] - Read terminated by close/EOF.
    Mar 4 20:00:07.71137 orc2 sebprod[26982:t@1969 ]/warn:
    [orcserver:MWY:cdsprod@orc1] - Read terminated by close/EOF.
    Mar 4 20:00:07.71216 orc2 sebprod[26982:t@144 ]/info:
    [orcserver:pEE:cdsprod@orc1] - Removed user (1 users connected).
    Mar 4 20:00:07.77698 orc2 sebprod[26982:t@1969 ]/info:
    [orcserver:MWY:cdsprod@orc1] - Removed user (0 users connected).
    Mar 4 20:00:07.77746 orc2 sebprod[26982:t@2 ]/info: [api] - Stop
    market (1)
    Mar 4 20:00:07.77754 orc2 sebprod[26982:t@2 ]/info: [api] - Logout
    from market (1)
    Mar 4 20:00:10.88219 orc2 sebprod[26982:t@17 ]/info: [api] -
    Received logout message from market (1)
    Mar 4 20:00:10.88231 orc2 sebprod[26982:t@17 ]/info: [api] - Market
    stopped (1)
    Mar 4 20:00:10.88465 orc2 sebprod[26982:t@2 ]/info: [orcserver] -
    Exiting [SIGINT/SIGTERM]...
 
Danke vielmals !

Leider habe ich vergessen zu sagen, dass es ein Solaris 10 OS ist.
Der kennt die Optionen nicht.

Ich habe mir folgendes mit Perl zusammengeschustert.

Code:
#!/bin/perl -w

#############################
#
# Open the file
#
#############################

open IN, 'seblogfile.log' || die "File was not found\n";
while( $line = <IN>){
        if ( ($line =~ /[a-zA-Z][a-zA-Z][a-zA-Z].[0-9][0-9].[0-9][0-9][:]/ ) && ($line =~ /error/)) {
                print "$line \n";
                                }
}
close IN;

An sich funktioniert der Code, nur zieht er leider nicht die nächsten 5 - 10 Zeilen in Betracht.
Könnte ich das ihm noch irgendwie beibringen ?
Od geht es mit anderen Optionen in der Shell auf der Solaris Maschine ?

Danke Dir vielmals

mfG
 
Was angenhem wäre:

Das man vll nur den String in einem bestimmten Bereich einer Uhrzeit sucht.
zB: zwischen 09:00 - 18:00
 
Es ist mir auch schonmal aufgefallen, dass es bei Solaris keinen context-grep gibt...

Mit Perl ist natürlich mehr möglich. Mir ist nur eines unklar: Ist das jeweils abwechselnd eine Datumszeile und eine Meldungszeile oder hat das nur das Forum automatisch umgebrochen?

Folgende perl-Lösungsansätze fallen mir ein:
1. Die Datei in ein Array slurpen und das Array mit einer for-Schleife durchlaufen. Innerhalb der for-Schleife kannst du vor und zurückspringen, wie du willst.
2. Fehlermeldungen in ein Hash sammeln und bei Erfolg wieder rauslöschen. Am Schluss die im Hash verbliebenen Fehler ausgeben.

Ich persönlich fände Nr. 2 eleganter ...
 
Der Zeilenumbruch entstand leider beim Kopieren, habe ich selber erst kürzlichst entdeckt.

Ich habe mir folgendes zusammengeschrieben, muss aber noch im Testbetrieb richtig ausgetestet werden.
Es werden dabei nur die letzten 10 Zeilen angesehen und nach einen Error und einem Reconnect untersucht.
Zudem lese ich die Uhrzeit ein und rechne es in Sekunden um.

Weiters gehe ich davon aus, dass in den letzten 10 Zeilen ja nicht 5 Einträge mit Error und 5 mit Reconnect aufscheinen werden.

Mich interessiert hierbei nur, sind in den letzten 10 Zeilen welche vorhanden und wenn ja, dann soll er nachschaun, ob der Reconnect grösser als der Error ist, wenn ja, dann weiss ich das alles in Ordnung ist.

Unschluessig bin ich mir noch, was aber passiert, wenn in den letzten 10 Zeilen mehrere Errors und Reconnects sind, wie kann ich da immer nur den letzten herausfiltern, also den aktuellsten ?

Für Verbesserungsvorschläge bin ich gerne natürlich bereit !

Code:
#!/bin/perl -w

$LOGDATUMERROR=`/usr/xpg4/bin/tail -1000 seblogfile.log  | grep -i error  | awk '{ print $3 }'`;
$USERCONNECT=`/usr/xpg4/bin/tail -10000 seblogfile.log | grep -i User | awk '{ print $3 }'`;

($hour, $minute, $sec)=split( ":", $LOGDATUMERROR);
$integer_error=($hour*60)+($minute*60);
print "aktuelle uhrzeit von logfile ist $integer_error\n";

($hour, $minute, $sec)=split( ":", $USERCONNECT);
$integer_user=($hour*60)+($minute*60);
print "aktuelle uhrzeit von Userconnect ist $integer_user\n";

$ergebnisende = $integer_user - $integer_error;

if ( $integer_user > $integer_error ) {
        print "Alter: $ergebnisende\n";
        }
 
Eines habe ich noch nicht ganz kapiert: Wie ermittelt man, welcher Fehler zu welchem erfolgreichen Versuch gehört?
 
Das weiss ich leider im Moment auch noch nicht.
Ich hoffe im Moment einfach einmal, dass er nach einem error sofort ein reconnect versucht.
Sollte hingegen ein error auftauchen und dann ein connect, wobei die beiden aber nicht zusammengehören, dann wirds natürlich problematisch.
Wir haben das System leider erst uebernommen, und wir muessen erst noch die ganzen Eigenheiten herausfinden.
 
Naja, folgend ein kleiner, schneller Hack. So ähnlich habe ich mir die Lösung mit dem Hash vorgestellt. Als "Kennung" - welchen error ich zu welchem Erfolg zuordne - habe ich mal das genommen, was zwischen dem ersten eckigen Klammernpaar steht...
Code:
use strict;
my %errors;
open (IN, "tail -200 seblogfile.log |") || die "$!\n";
while (<IN>) {
  if (/orc2 sebprod\[([^]]*)\]\/(error|info):(.*)/) {
    $errors{$1}=$_ if ($2 eq "error");
    undef $errors{$1} if ($2 eq "info" && $3=~/users connected/);
  }
}
close IN;
print $errors{$_} for (sort keys %errors);
 
Ich hab dein Programm einmal durchlaufen lassen durch das log - file und am Ende gibt er dann den error aus.
Aber eigentlich gibt es lt. log - File doch schon wieder connects ??

Wir interpretieren diese Zeile immer als erfolgreichen reconnect


  • Mar 4 16:52:54.97574 orc2 sebprod[26982:t@1969 ]/info: [orcserver] - User connected from [10.117.212.21:2045]
Oder habe ich da was falsch verstanden im Script ?
 
byron1778 schrieb:
Aber eigentlich gibt es lt. log - File doch schon wieder connects ??

Wir interpretieren diese Zeile immer als erfolgreichen reconnect

Sorry, aber jetzt verstehe ich wirklich nicht mehr was du willst. Wenn die von dir gepostete Zeile wirklich alle vorhergehenden Fehler ungeschehen macht, dann brauchst du doch nur zu suchen, ob es nach der letzten connected-Zeile noch Error-Zeilen kommen, oder? Dann brauchst du doch keine Zeit-Interpretation, keinen grep mit context oder sonst irgendetwas...

Code:
use strict; 
my @errors; 
open (IN, "tail -200 seblogfile.log |") || die "$!\n"; 
while (<IN>) { 
  push @errors, $_ if (/error/);
  @errors=() if (/connected/);
} 
close IN; 
print for (@errors);
Du musst nur noch die beiden regexp noch genauer formulieren. Genau genommen könnte man das auch auf der Kommandozeile lösen...

Oder habe ich da was falsch verstanden im Script ?
Das vorhergehende Script hat intelligenter gesucht. Es hat nachgesehen, ob es für jeden "error" zeitlich dannach ein "users connected" gibt. Für die Zuordnung (also was zusammengehört) wurde z.B: 26982:t@1969 verwendet. Aber vergiss das script, falls das jetzige besser passt. Am besten wäre aber aus meiner Sicht, wenn du eine ganz genaue Beschreibung posten würdest.
 
Das Problem ist halt im Moment noch, dass wir nicht ganz genau wissen, ob die einzelnen Error - Meldungen auch genau das Ergebnis sind, was wir uns denken, und da es die Produktion ist, koennen wir es leider nicht so einfach testweise abschalten !

Im Moment ist mal nur ne Vermutung.

Aber ich danke Dir vielmals für die Hilfe.
Mit Deinen Scripten kann ich schon vieles weitermachen.
Mir ging es auch um die Vorangehensweise, wie es jemand anderer lösen würde.
Ich hab es nach der Uhrzeit versucht.

Danke vielmals.
 
Hiho,

rein interessehalber: kannst du nicht einfach GNU grep aufspielen? Ansonsten mal
Code:
qor@wave:~> grep -A 2 -B 2 ddd blub
bbb
ccc
ddd
eee
fff
qor@wave:~> ex -R blub <<!
> g/ddd/.-2,.+2p
> q
> !
bbb
ccc
ddd
eee
fff
qor@wave:~>
probieren.

Mit freundlichem Gruß.
 
qor schrieb:
rein interessehalber: kannst du nicht einfach GNU grep aufspielen?
Wenn man aus der Linux-Welt kommt, wird man den Eindruck nicht los, dass auf Solaris einige Utilities bzw. wichtige Optionen derselben fehlen. Mir persönlich sind beim Installieren auf der Solaris-Kiste die Hände gebunden, da ich kein Admin bin.

Aber manchmal kann man das Benötigte in perl schreiben - ein perl-Interpreter ist ja zum Glück vorhanden ;)

Jüngstes Beispiel bei mir: md5sum.
http://www.silug.org/~steve/software/scripts/perl/md5sum
... ich finde die Lösung genial.
 
Das sollte auch auf einer Sun ohne Perl gehen:

Code:
SUCHSTRING=xxx
LINES=10
export  SUCHSTRING LINES
tail -200 file.log | | /usr/xpg4/bin/awk "/$SUCHSTRING/ { FOUND=NR; print ; next }
        { if (FOUND != 0 && (FOUND+$LINES) > NR )print ; next }"

Haveaniceday

Edit:
> Wenn man aus der Linux-Welt kommt, wird man den Eindruck nicht los, dass auf Solaris einige Utilities bzw. wichtige Optionen derselben fehlen. Mir persönlich sind beim Installieren auf der Solaris-Kiste die Hände gebunden, da ich kein Admin bin.

Check mal den Suchpfad mit echo $PATH . /usr/xpg4/bin sollte vor /usr/bin kommen,
dann ist Sun etwas erträglicher.
 
haveaniceday schrieb:
Das sollte auch auf einer Sun ohne Perl gehen:
mit awk? Klar, ist ja nur eine andere Scriptsprache. Aber in irgendeinem perl-Buch habe ich mal gelesen, dass awk eine echte Teilmenge von perl ist... :wink:

Check mal den Suchpfad mit echo $PATH . /usr/xpg4/bin sollte vor /usr/bin kommen,
Kenn ich schon. Allerdings kennt der xpg4-grep auch keinen context...
 
awk hat wenigstens den Vorteil, daß er auch vorhanden ist wenn niemand zusätzliche
Tools wie perl installiert hat.
awk sollte bei jeder minimalst-Installation dabei sein. Und manche Admins sind echt faul
und installieren nur das von ihnen benötigte.
 
haveaniceday schrieb:
awk hat wenigstens den Vorteil, daß er auch vorhanden ist wenn niemand zusätzliche
Tools wie perl installiert hat.
awk sollte bei jeder minimalst-Installation dabei sein. Und manche Admins sind echt faul
und installieren nur das von ihnen benötigte.
perl gehört doch auch zum Standard, und zwar auch schon seit längerem. Das kommt bei(ich wage zu behaupten) jeder Linux-Distri und auch bei Solaris automatisch mit. Nur bei Windows ist es noch nicht so :wink:

BTW: Gibt's überhaupt eine Linux-Distri, die ohne perl auskommt? Zumindest bei SuSE bin ich schon auf Installationsroutinen gestoßen, die ohne perl gar nicht mehr auskommen würden...
 
Oben