2009-07-08 10 views
2

Ich schreibe ein Shell-Skript, um einen "Schwanz" in einer wachsenden Protokolldatei zu erstellen. Dieses Skript akzeptiert Parameter, nach denen gesucht wird, und inkrementell die Ausgabe auf ihnen.GREP-Zeichenfolgen dynamisch erstellen

Zum Beispiel, wenn das Skript wie folgt aufgerufen wird:

logs.sh string1 string2 

sollte es übersetzen:

tail -f logs.txt | grep string1 | grep string2 

Ich baue die Liste der grep Strings wie folgt aus:

full_grep_string="" 
for grep_string in $* 
do 
    full_grep_string="$full_grep_string | grep $grep_string" 
done 

Die Zeichenfolge ist korrekt erstellt, aber wenn ich versuche, es schließlich zu den Schwanz Befehl zu markieren, so ...

tail -f $LOG_FILE_PATH $full_grep_string 

... die grep gilt nicht, und ich bekomme die ungefilterten Protokolle.

Fehle ich hier etwas? Oder gibt es einen einfacheren Weg, dies zu tun?

+0

Nur eine kleine Klarstellung: Ist die Idee, dass Ihr Skript ausgeben sollte die Zeilen der Protokolldatei, das beide enthält string1 und string2, oder wollten Sie Zeilen finden, die eine der Strings enthalten? –

+0

Auch, welche Shell verwenden Sie? Bash? –

+0

für mich auf Debian Lenny Ich habe das Problem, dass zwei Grep kombiniert nicht funktionieren mit Schwanz -f aber mit nur Schwanz – tuergeist

Antwort

2
eval tail -f $LOG_FILE_PATH $full_grep_string 
+0

Es hat funktioniert! Vielen Dank! :) –

1

grep puffert die gefundene Zeile. So ändern Sie Ihren Code zu

full_grep_string="$full_grep_string | grep --line-buffered $grep_string" 

soll funktionieren. Ich habe es auf Debian Lenny (mit Bash) getestet.

Und mit der Spitze AN0

eval tail -f ... 

(das funktioniert für alle ganze Wörter)

+0

Danke für den Tipp .. aber es sieht so aus, als wäre meine Version von Grep zu alt, um vollständige Argumente zu nehmen. Ich teste gerade auf einer SunOS 5.8-Box. Sehr alte Software. :) –