Kommandozeilen-Jongliererei

Antworten
Nachricht
Autor
Jurb

Kommandozeilen-Jongliererei

#1 Beitrag von Jurb » 19. Sep 2007 9:27

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: Alles auswählen

<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 Beitrag von Jurb » 19. Sep 2007 9:48

Für das 1. Problem habe ich die Lösung gefunden:

Code: Alles auswählen

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]

Benutzeravatar
hastifranki
Beiträge: 259
Registriert: 06. Mai 2006 19:58

#3 Beitrag von hastifranki » 19. Sep 2007 20:05

Vielleicht hilft folgendes Perl-Script weiter:

Code: Alles auswählen

#!/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 Beitrag von ugly script » 23. Sep 2007 3:49

Code: Alles auswählen

#!/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 $?')

Antworten