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?



@ 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

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

-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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.