Colorear diferentes fuentes de cola

19

Estoy viendo diferentes registros por

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

¿Cómo puedo tener la salida de cada registro coloreado de manera diferente?

Daniel W.
fuente
@ MattBianco gracias, voy a echar un vistazo multitaily las respuestas en esta pregunta
Daniel W.
1
Además de las excelentes respuestas a continuación, también puede consultar unix.stackexchange.com/questions/26313/colored-find-output que muestra cómo hacer mucho más con la coloración de los archivos de salida.
Joe

Respuestas:

21

Usando GNU greppara colorear:

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)

Tenga en cuenta que los primeros 2 se inician en segundo plano. Eso significa que no se eliminarán si presiona Ctrl-C(el shell ignora explícitamente SIGINT para trabajos asincrónicos).

Para evitar eso, puedes hacer lo siguiente:

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

De esa manera, Ctrl-Cel último tail+grepy el catdado (del SIGINT) y los otros dos grep + tails morirán de un SIGPIPE la próxima vez que escriban algo.

O restablezca el controlador SIGINT (no funcionará con todos los 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)

También puedes hacerlo en la colorfunción. Eso no se aplicará tail, pero tailmorirá de un SIGPIPE la próxima vez que escriba si grepmuere.

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)

O haga que toda la cola + grep sea una función:

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 todo el asunto:

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
fuente
Cuando pongo esto en mi script "watch.sh", vuelve a mi consola pero se imprimen los mensajes, vea i.imgur.com/yaiBwMo.png
Daniel W.
@Dan, mira la edición
Stéphane Chazelas
Gracias por su esfuerzo al escribir esta respuesta, elegí la tailcfunción que mejor funcionó y se ve más intuitiva en el script.
Daniel W.
4

Algo como esto funcionó para mí:

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

Explicación:

  • tail -f file: agregar datos a medida que el archivo crece
  • awk -W interactive: establecer awken modo interactivo
  • '{printf "\033[1;31m%s\033[0m\n", $0}' imprime la salida coloreada en el terminal.
  • \033[1;31m significa rojo
  • \033[1;32m significa verde
  • \033[1;34m significa azul
caos
fuente
-W interactiveparece ser mawkespecífico. (la forma en que mawkalmacena su entrada de forma predeterminada también es única, y -W interactiveno sería necesaria en otras awkimplementaciones).
Stéphane Chazelas