Färben Sie verschiedene Quellen für Schwanz

19

Ich beobachte verschiedene Protokolle von

tail -q -f /var/log/syslog -f /var/log/fail2ban.log -f /var/log/nginx/error.log

Wie kann ich die Ausgabe jedes Protokolls anders färben lassen?

Daniel W.
quelle
@ MattBianco danke, ich werde einen Blick in multitailund die Antworten in dieser Frage haben
Daniel W.
1
Zusätzlich zu den großartigen Antworten unten können Sie auch unix.stackexchange.com/questions/26313/colored-find-output aufrufen , um zu zeigen, wie Sie mit dem Einfärben von Ausgabedateien noch viel mehr anfangen können.
Joe

Antworten:

21

Verwendung von GNU grepfür die Färbung:

color() { GREP_COLOR=$1 grep --color '.*'; }

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33)

Beachten Sie, dass die ersten 2 im Hintergrund gestartet werden. Das bedeutet, dass sie nicht getötet werden, wenn Sie drücken Ctrl-C(Shell ignoriert SIGINT explizit für asynchrone Jobs).

Um dies zu verhindern, können Sie stattdessen Folgendes tun:

color() { GREP_COLOR=$1 grep --line-buffered --color=always '.*'; }

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33) | cat

Auf diese Weise sterben Ctrl-Cdas letzte tail+grepund das letzte und catdie beiden anderen Grep + Tails eines Sigpipes, wenn sie das nächste Mal etwas schreiben.

Oder stellen Sie den SIGINT-Handler wieder her (funktioniert nicht mit allen Shells):

color() { GREP_COLOR=$1 grep --color '.*'; }

((trap - INT; tail -qf /var/log/syslog | color 31) &
(trap - INT; tail -qf /var/log/fail2ban.log | color 32) &
tail -qf /var/log/nginx/error.log | color 33)

Sie können dies auch in der colorFunktion tun . Das trifft nicht zu tail, tailstirbt aber beim nächsten Schreiben an einem Sigpipe, wenn es grepstirbt.

color() (trap - INT; GREP_COLOR=$1 exec grep --color '.*')

(tail -qf /var/log/syslog | color 31 &
tail -qf /var/log/fail2ban.log | color 32 &
tail -qf /var/log/nginx/error.log | color 33)

Oder machen Sie den ganzen Schwanz + grep zu einer Funktion:

tailc() (trap - INT; export GREP_COLOR="$1"; shift; tail -qf -- "$@" |
   grep --color '.*')
tailc 31 /var/log/syslog &
tailc 32 /var/log/syslog &
tailc 33 /var/log/nginx/error.log

Oder das Ganze:

tailc() (
  while [ "$#" -ge 2 ]; do
    (trap - INT; tail -f -- "$2" | GREP_COLOR=$1 grep --color '.*') &
    shift 2
  done
  wait
)

tailc 31 /var/log/syslog 32 /var/log/syslog 33 /var/log/nginx/error.log
Stéphane Chazelas
quelle
Wenn ich dies in mein "watch.sh" -Skript schreibe, kehrt es zu meiner Konsole zurück, aber die Nachrichten werden gedruckt, siehe i.imgur.com/yaiBwMo.png
Daniel W.
@ Dan, siehe die Bearbeitung
Stéphane Chazelas
Vielen Dank für Ihre Mühe, diese Antwort zu schreiben. Ich habe mich für die tailcFunktion entschieden, die am besten funktioniert und im Skript am intuitivsten aussieht.
Daniel W.
4

So etwas hat bei mir funktioniert:

(tail -f /var/log/syslog | awk -W interactive '{printf "\033[1;31m%s\033[0m\n", $0}' & \
tail -f /var/log/auth.log | awk -W interactive '{printf "\033[1;32m%s\033[0m\n", $0}' & \
tail -f /var/log/Xorg.0.log | awk -W interactive '{printf "\033[1;34m%s\033[0m\n", $0}')

Erläuterung:

  • tail -f file: Daten anhängen, wenn die Datei wächst
  • awk -W interactive: awkauf interaktiven Modus einstellen
  • '{printf "\033[1;31m%s\033[0m\n", $0}' Drucken Sie die Ausgabe farbig auf das Terminal.
  • \033[1;31m bedeutet rot
  • \033[1;32m bedeutet grün
  • \033[1;34m bedeutet blau
Chaos
quelle
-W interactivescheint mawk-spezifisch zu sein. (Die Art und Weise, in der mawkdie Eingabe gepuffert wird, ist ebenfalls eindeutig und wird -W interactivein anderen awkImplementierungen nicht benötigt. )
Stéphane Chazelas