879 Stimmen

Wie kann man einen kontinuierlichen Datenstrom "greppen"?

Ist das möglich, wenn man grep in einem kontinuierlichen Strom?

Was ich meine, ist eine Art tail -f <file> Befehl, sondern mit grep auf die Ausgabe, um nur die Zeilen zu behalten, die mich interessieren.

Ich habe versucht tail -f <file> | grep pattern aber es scheint, dass grep kann nur einmal ausgeführt werden tail beendet, das heißt, niemals.

12voto

mebada Punkte 2162

Sie können diese Antwort als Verbesserung betrachten normalerweise verwende ich

tail -F <fileName> | grep --line-buffered  <pattern> -A 3 -B 5

-F ist besser, wenn die Datei gedreht werden soll (-f funktioniert nicht richtig, wenn die Datei gedreht wurde)

-A und -B sind nützlich, um Zeilen vor und nach dem Auftreten des Musters zu erhalten. Diese Blöcke erscheinen zwischen gestrichelten Trennlinien.

Aber ich bevorzuge folgende Maßnahmen

tail -F <file> | less

Dies ist sehr nützlich, wenn Sie in gestreamten Protokollen suchen wollen. Ich meine zurück und vorwärts gehen und tief schauen

7voto

Hans.Loven.work Punkte 108

Ich habe niemanden gesehen, der mein übliches Angebot in dieser Sache gemacht hat:

less +F <file>
ctrl + c
/<search term>
<enter>
shift + f

Ich bevorzuge diese Methode, weil man damit ctrl + c um anzuhalten und durch die Datei zu navigieren, wann immer Sie wollen, und drücken Sie dann einfach shift + f um zur Live-Streaming-Suche zurückzukehren.

4voto

Christian Herr Punkte 59

sed wäre eine bessere Wahl ( Strom Herausgeber)

tail -n0 -f <file> | sed -n '/search string/p'

und dann, wenn Sie möchten, dass der Befehl tail beendet wird, sobald Sie eine bestimmte Zeichenfolge gefunden haben:

tail --pid=$(($BASHPID+1)) -n0 -f <file> | sed -n '/search string/{p; q}'

Offensichtlich ein Bashismus: $BASHPID wird die Prozess-ID des tail-Befehls sein. Der sed-Befehl folgt in der Pipe nach tail, also ist die sed-Prozess-ID $BASHPID+1.

4voto

F. Hauri Punkte 57640

Da ich mich erst spät zu dieser Frage geäußert habe und diese Art von Arbeit als einen wichtigen Teil der Überwachungsarbeit betrachte, möchte ich Folgendes sagen (nicht so kurz) Antwort...

Folgende Protokolle mit bash

1. Befehl tail

Dieser Befehl ist etwas mühsamer als die bereits veröffentlichte Antwort zu lesen

  1. Der Unterschied zwischen folgen Option tail -f y tail -F , von Manpage :

       -f, --follow[={name|descriptor}]
              output appended data as the file grows;
    ...
       -F     same as --follow=name --retry
    ...
       --retry
              keep trying to open a file if it is inaccessible

    Das bedeutet: durch die Verwendung von -F anstelle von -f , tail öffnet die Datei(en) erneut, wenn sie entfernt wurde(n) (z. B. bei der Protokollrotation).
    Dies ist nützlich, um die Logdatei über mehrere Tage hinweg zu beobachten.

  2. Fähigkeit zu folgen mehr als eine Datei gleichzeitig
    Ich habe sie bereits verwendet:

    tail -F /var/www/clients/client*/web*/log/{error,access}.log /var/log/{mail,auth}.log \
               /var/log/apache2/{,ssl_,other_vhosts_}access.log \
               /var/log/pure-ftpd/transfer.log

    Für die Verfolgung von Ereignissen durch Hunderte von Dateien... (beachten Sie den Rest dieser Antwort, um zu verstehen, wie man sie lesbar macht... ;)

  3. Verwendung von Schaltern -n (Verwenden Sie nicht -c für die Leitungspufferung!).
    Standardmäßig tail werden die letzten 10 Zeilen angezeigt. Dies kann eingestellt werden:

    tail -n 0 -F file

    Folgt der Datei, aber nur neue Zeilen werden gedruckt

    tail -n +0 -F file

    Wird gedruckt ganz Datei, bevor er seinen Weg fortsetzt.

2. Pufferprobleme bei Rohrleitungen :

Wenn Sie planen, Ausgänge zu filtern, sollten Sie Pufferung ! Siehe -u Option für sed , --line-buffered para grep o stdbuf mando:

tail -F /some/files | sed -une '/Regular Expression/p'

Ist (viel effizienter als die Verwendung von grep ) sehr viel reaktiver, als wenn Sie nicht die -u zuschalten sed Befehl.

tail -F /some/files |
    sed -une '/Regular Expression/p' |
    stdbuf -i0 -o0 tee /some/resultfile

3. Aktuelles Journalsystem

Auf neueren Systemen wird anstelle von tail -f /var/log/syslog müssen Sie laufen journalctl -xf auf fast die gleiche Weise...

journalctl -axf | sed -une '/Regular Expression/p'

Aber lesen man page Dieses Tool wurde für Protokollanalysen entwickelt!

4. Die Integration in eine bash Skript

  1. Farbige Ausgabe von zwei Dateien (oder mehr)

    Hier ist ein Beispiel für ein Skript, das viele Dateien überwacht und das Ergebnis für die 1. Datei anders einfärbt als für andere:

    #!/bin/bash
    
    tail -F "$@" |
        sed -une "
            /^==> /{h;};
            //!{
                G;
                s/^\\(.*\\)\\n==>.*${1//\//\\\/}.*<==/\\o33[47m\\1\\o33[0m/;
                s/^\\(.*\\)\\n==> .* <==/\\o33[47;31m\\1\\o33[0m/;
                p;}"

    Auf meinem Rechner funktionieren sie einwandfrei:

    sudo ./myColoredTail /var/log/{kern.,sys}log
  2. Interaktives Skript

    Vielleicht beobachten Sie die Protokolle, um auf Ereignisse zu reagieren?

    Hier ist ein kleines Skript, das einen Ton abspielt, wenn ein USB-Gerät auftaucht oder verschwindet, aber dasselbe Skript könnte auch Mails senden oder jede andere Interaktion, wie das Einschalten der Kaffeemaschine...

    #!/bin/bash
    
    exec {tailF}< <(tail -F /var/log/kern.log)
    tailPid=$!
    
    while :;do
        read -rsn 1 -t .3 keyboard
        [ "${keyboard,}" = "q" ] && break
        if read -ru $tailF -t 0 _ ;then
            read -ru $tailF line
            case $line in
                *New\ USB\ device\ found* ) play /some/sound.ogg ;;
                *USB\ disconnect* ) play /some/othersound.ogg ;;
            esac
            printf "\r%s\e[K" "$line"
        fi
    done
    
    echo
    exec {tailF}<&-
    kill $tailPid

    Sie könnten kündigen durch Drücken von Q Schlüssel.

2voto

Caleb Punkte 4731

Ja, das funktioniert tatsächlich sehr gut. Grep und die meisten Unix-Befehle arbeiten mit Datenströmen in einer Zeile. Jede Zeile, die aus tail herauskommt, wird analysiert und weitergegeben, wenn sie passt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X