Colorare diverse fonti per la coda


19

Sto guardando diversi registri di

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

Come posso avere l'output di ciascun registro colorato in modo diverso?



@MattBianco grazie, darò un'occhiata multitaile le risposte a questa domanda
Daniel W.

1
Oltre alle ottime risposte di seguito, potresti anche dare un'occhiata a unix.stackexchange.com/questions/26313/colored-find-output che mostra come fare molto di più con la colorazione dei file di output.
Joe,

Risposte:


21

Usare GNU grepper la colorazione:

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)

Si noti che i primi 2 vengono avviati in background. Ciò significa che non verranno uccisi se si preme Ctrl-C(la shell ignora esplicitamente SIGINT per i lavori asincroni).

Per evitarlo, puoi invece fare:

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

In questo modo, dopo Ctrl-Cl'ultimo tail+grepe il catmorto (del SIGINT) e gli altri due grep + code moriranno di un SIGPIPE la prossima volta che scrivono qualcosa.

Oppure ripristina il gestore SIGINT (non funzionerà con tutte le shell):

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)

Puoi anche farlo nella colorfunzione. Questo non si applica a tail, ma tailmorirà di SIGPIPE la prossima volta che scrive se grepmuore.

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)

Oppure fai funzionare l'intera coda + grep:

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

O il tutto:

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

Quando lo inserisco nel mio script "watch.sh", ritorna sulla mia console ma i messaggi vengono stampati, vedi i.imgur.com/yaiBwMo.png
Daniel W.

@Dan, guarda la modifica
Stéphane Chazelas,

Grazie per il tuo impegno nello scrivere questa risposta, sono andato con la tailcfunzione che ha funzionato meglio e sembra più intuitiva nella sceneggiatura.
Daniel W.

4

Qualcosa del genere ha funzionato per me:

(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}')

Spiegazione:

  • tail -f file: aggiungi dati man mano che il file cresce
  • awk -W interactive: impostato awksulla modalità interattiva
  • '{printf "\033[1;31m%s\033[0m\n", $0}' stampa l'output colorizzato sul terminale.
  • \033[1;31m significa rosso
  • \033[1;32m significa verde
  • \033[1;34m significa blu

-W interactivesembra essere mawkspecifico. (anche il modo in cui mawkmemorizza il buffer per input è univoco e -W interactivenon sarebbe necessario in altre awkimplementazioni).
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.