Tail mehrere Dateien, während eine der Dateien durch grep geleitet wird

2615
Brian

Ich möchte tail zwei Protokolldateien folgen, aber eine der Protokolldateien enthält zu viele Daten, daher möchte ich, dass sie mit grep gefiltert wird.

tail -f file1 file2|grep mySearch 

Das Problem dabei ist, dass beide Dateien durch das grep laufen, oder die Ausgabe von tail durch grep. Nur file2 sollte mit dem grep von mySearch gefiltert werden. Irgendwelche Ideen?

Ich habe Named Pipes, Prozessersetzungen und Verbundbefehle ausprobiert.

4

3 Antworten auf die Frage

2
John T

Es gibt viele Möglichkeiten, eine Katze zu enthäuten. Mein persönlicher Liebling aller Zeiten ist jedoch MultiTail . Es bietet eine Vielzahl von Möglichkeiten zum Konfigurieren und Anzeigen der Ausgabe von Dateien sowie eine Reihe von Möglichkeiten zum Filtern dieser Ausgabe über Regex. Sie können zum Beispiel 1 Datei filtern, während Sie eine weitere 4 unverändert lassen. Sie können auch einen umgekehrten Filter ausführen, genau wie ein grep -v.

Eine Seite mit Beispielbefehlen finden Sie unter http://www.vanheusden.com/multitail/examples.html

Sie können auch ein paar Screenshots davon in Aktion sehen. Mehrere Fenster werden von ncurses gesteuert.

Wenn Sie der Programmiertyp wie ich sind, können Sie eine personalisierte Lösung erstellen, die sich an den Perles File :: Tail- Modul orientiert, und zwar selectan den separaten Ziehpunkten.

1
bryan

können Sie die beiden Schwänze im Hintergrund ausführen und die gefilterte und ungefilterte Ausgabe an eine temporäre Datei weiterleiten.

Verwenden Sie dann diese temporäre Datei als Quelle für alles, was Sie zum Dosieren benötigen -

tail -f file1 >> temp & tail -f file2 | grep mySearch >> temp &   do something with temp now 
Es scheint, dass die zweite Zeile in Ihrer Lösung (die Zeile mit grep) nicht funktioniert. Wenn ich nur eine Datei taile und das tail grep und es an eine Datei im Hintergrund schicke - und dann die temporäre Datei -, wird die temporäre Datei nie geschrieben. Irgendwelche Vorschläge. Brian vor 13 Jahren 0
Ich habe es herausgefunden - musste meiner grep-Anweisung --line-buffered hinzufügen. Aber jetzt habe ich andere Probleme - wenn zum Beispiel die Verbindung geschlossen wird, läuft tail immer noch auf dem Server, obwohl ich die Option -t an ssh gebe. Es scheint auch, als würde die Ausgabe aus der Protokolldatei, die greped ist, zweimal eingefügt. Danke für die Hilfe. Brian vor 13 Jahren 1
Egal was ich über die Abläufe gesagt habe. Es muss aus früheren Tests stammen. Brian vor 13 Jahren 0
Wie ist nun der Status? bryan vor 13 Jahren 0
Dies ist der Befehl, mit dem ich endete: (tail -f ~ / file1 >> temp &); (tail -f file2 | grep --line-buffered mySearch >> temp &); tail -f temp Ich musste --line-buffered verwenden, damit es funktioniert. Vielen Dank. Brian vor 13 Jahren 0
1
john

Multitail klingt genau so, wie ich es brauche.

Dies ist etwas, was ich getan habe, was in Ordnung ist, außer dass die Protokollzeilen nicht in exakter zeitlicher Reihenfolge sind.

------------- 8 <-------------

#!/bin/bash  function pidof_prog_file() { PGM=$1 FIL=$2 lsof -n 2>/dev/null| grep "$.*$" | tr -s ' ' | cut -d' ' -f 2 }  T="tail -n 10 -f"  kill -TERM `pidof_prog_file tail application.log` $T /var/www/protected/runtime/application.log | tr '\t' ' ' | tr -s ' ' | sed "s|^|PHP:|" &  kill -TERM `pidof_prog_file tail access.log` $T /var/log/apache2/access.log | tr '\t' ' ' | tr -s ' ' | sed "s|^|HTTP:|" &  kill -TERM `pidof_prog_file tail catalina.out` $T /var/log/tomcat6/catalina.out | tr '\t' ' ' | tr -s ' ' | sed "s|^|JAVA:|" &  kill -TERM `pidof_prog_file ssh devj-db` sudo -u $ME ssh $dbhost "$T /var/log/mysql/query.log" | tr '\t' ' ' | tr -s ' ' | sed "s|^|SQL:|"