Kommandozeilen-Jongliererei

Post Reply
Message
Author
Jurb

Kommandozeilen-Jongliererei

#1 Post 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

Jurb

#2 Post 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]

User avatar
hastifranki
Posts: 259
Joined: 06. May 2006 19:58

#3 Post 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

ugly script

#4 Post 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 $?')

Post Reply