Забарвлення різних джерел для хвоста


19

Я переглядаю різні журнали

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

Як я можу мати вихід кожного журналу кольором по-різному?



@MattBianco спасибі, я ознайомлюсь multitailі відповіді на це запитання
Daniel W.

1
На додаток до чудових відповідей нижче, ви також можете перевірити unix.stackexchange.com/questions/26313/colored-find-output, який показує, як зробити набагато більше з колоризуючими вихідними файлами.
Джо

Відповіді:


21

Використання GNU grepдля фарбування:

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)

Зауважте, що перші 2 запускаються у фоновому режимі. Це означає, що вони не будуть вбиті, якщо натиснути Ctrl-C(оболонка явно ігнорує SIGINT для асинхронних завдань).

Щоб цього не допустити, ви можете зробити:

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

Таким чином, при Ctrl-Cостанньому tail+grepі catвмиранні (ЗНАКУ) та двох інших греп + хвіст відмирають від ЗНАЧЕННЯ наступного разу, коли вони щось напишуть.

Або відновіть обробник SIGINT (не працюватиме з усіма оболонками):

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)

Ви також можете це зробити у colorфункції. Це не стосується tail, але tailпомре від ПІДПРИЄМЦЯ наступного разу, коли він напише, якщо grepпомирає.

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)

Або зробіть цілий хвіст + греп функцією:

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

Або вся справа:

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

Коли я ставлю це до свого сценарію "watch.sh", він повертається на мою консоль, але повідомлення надруковуються, див. I.imgur.com/yaiBwMo.png
Daniel W.

@Dan, дивіться правку
Stéphane Chazelas

Дякую за ваші зусилля щодо написання цієї відповіді, я пішов із tailcфункцією, яка найкраще працювала і виглядає найбільш інтуїтивно зрозумілою в сценарії.
Даніель В.

4

Щось так працювало для мене:

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

Пояснення:

  • tail -f file: додавання даних у міру зростання файлу
  • awk -W interactive: встановлено awkв інтерактивному режимі
  • '{printf "\033[1;31m%s\033[0m\n", $0}' вивести кольоровий вивід у термінал.
  • \033[1;31m означає червоний
  • \033[1;32m означає зелений
  • \033[1;34m означає синій

-W interactiveздається, mawk-специфічним. (спосіб mawkбуферизації його даних за замовчуванням також унікальний і -W interactiveне потребує інших awkреалізацій).
Стефан Шазелас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.