Page 1 of 1

Kommandozeilen-Jongliererei

Posted: 19. Sep 2007 9:27
by Jurb
Hallo auch,

ich habe ein Logfile von einem propietären Bussystem. Der Bus funktioniert generell so, dass auf eine REQUEST-Meldung eine RESPONSE-Meldung eingeht. Scheinbar gibts hiermit ein Problem. Ich habe ein Textfile, das wie folgt ausschaut:

Code: Select all

<Packetnummer>, <DST>, <SRC>, <TYPE>, <DATA>
...
...
Für <TYPE> sind verschiedene Meldungstypen möglich, unter anderem Request und Response.
Nun möchte ich automatisiert überprüfen, dass auf jedes Request eine Response eingeht. Ich kann z.B. mit grep alle Request oder alle Response Meldungen rausholen, aber ich habs nicht geschafft, dass Request UND Response Meldungen rausgeholt (d.h. in ein separates File geschrieben) werden. Damit will ich mal alle nicht relevanten Meldungen rausfiltern.
Als nächstes ist die Frage, wie ich irgendwie mit Linux-Shell-Boardmitteln gucken kann, das auf jede Request-Meldung eine Response-Meldung in der darauffolgenden Zeile steht. Ich habe mir mal awk angeschaut, aber auf die schnelle krieg ich da nix hin...

Habt Ihr vieleicht eine gute Idee? Wäre cool!

Danke

Jurb

Posted: 19. Sep 2007 9:48
by Jurb
Für das 1. Problem habe ich die Lösung gefunden:

Code: Select all

grep -i -E "response|request" logfile.txt > filtered.txt
Wie kann ich jetzt automatisiert checken, dass auf ein request ein response i der (darauffolgenden) Zeile kommt?

Danke![/code]

Posted: 19. Sep 2007 20:05
by hastifranki
Vielleicht hilft folgendes Perl-Script weiter:

Code: Select all

#!/usr/bin/perl -w
open &#40;FH, "logfile.txt"&#41; or die "Die Datei lässt sich nicht öffnen\n";
$sw = 0;
while &#40;$line=<FH>&#41; &#123;
	if &#40;$line =~ /response/ and $sw&#41; &#123;print "$line"; $sw = 0&#125;;
	if &#40;$line =~ /request/ and not $sw&#41; &#123;print "$line"; $sw = 1&#125; else &#123;$sw=0&#125;;
	&#125;;
close FH;
print "\n"
Damit die Datei ausführbar ist, muss chmod +x Dateinname.pl eingegeben werden.

Man kann natürlich die Ausgabe auch noch umleiten: ./Dateiname.pl >filtered.txt

Möglicherweise gibt es auch noch andere Lösungsmöglichkeiten.

Viele Grüße
Frank

Posted: 23. Sep 2007 3:49
by ugly script

Code: Select all

#!/bin/bash

check=0;
lineno=0;
while read line; do
	if &#91; `echo $line |grep request $1>/dev/null; echo $?` -eq 0 &#93;; then
		check=`expr $check + 1`
	elif &#91; `echo $line |grep response $1>/dev/null; echo $?` -eq 0 &#93;; then
		check=`expr $check - 1`
	fi
	if &#91; $check -gt 1 &#93;; then
		exit $lineno;
	fi
	lineno=`expr $lineno + 1`
done < logfile
Auf die Schnelle hingezimmert. Treten zwei requests hintereinander auf, bricht das script ab und der Rückgabewert enthält die Zeilennummer des zweiten request. (Zu erfragen mit 'echo $?')