Kuyruk için farklı kaynakları renklendirme


19

Farklı günlükler izliyorum

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

Her günlüğün çıktısını nasıl farklı renklendirebilirim?



@MattBianco teşekkürler, multitailbu soruya bir göz atacağım ve cevaplarım
Daniel W.

1
Aşağıdaki harika yanıtlara ek olarak, çıktı dosyalarını renklendirme ile çok daha fazlasını nasıl yapacağınızı gösteren unix.stackexchange.com/questions/26313/colored-find-output adresini de kontrol etmek isteyebilirsiniz .
Joe

Yanıtlar:


21

grepRenklendirme için GNU kullanma :

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)

İlk 2'nin arka planda başlatıldığını unutmayın. Bu, tuşuna basarsanız öldürülmeyecekleri anlamına gelir Ctrl-C(kabuk, eşzamansız işler için SIGINT'i açıkça yoksay).

Bunu önlemek için şunları yapabilirsiniz:

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

Bu şekilde, Ctrl-Cson olarak tail+grepve cat(SIGINT'in) ölümü ve diğer iki grep + kuyruğu, bir daha bir şeyler yazdıklarında bir SIGPIPE'den öleceklerdir.

Veya SIGINT işleyicisini geri yükleyin (tüm kabuklarla çalışmaz):

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)

Bunu colorişlevde de yapabilirsiniz . Bu geçerli olmayacak tail, ama tailbir dahaki sefere grepölürse bir SIGPIPE'den ölecektir .

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)

Veya tüm kuyruğu + grep'i bir işlev haline getirin:

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

Veya her şey:

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

Benim "watch.sh" komut içine bu koyduğunuzda, benim konsola döner ancak iletiler basılı olsun, bkz i.imgur.com/yaiBwMo.png
Daniel W.

@Dan, düzenlemeye bakın
Stéphane Chazelas

Bu cevabı yazma çabanız için teşekkür ederim, tailcen iyi çalışan ve senaryoda en sezgisel görünen fonksiyona gittim .
Daniel

4

Böyle bir şey benim için çalıştı:

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

Açıklama:

  • tail -f file: dosya büyüdükçe veri ekleme
  • awk -W interactive: awketkileşimli moda ayarla
  • '{printf "\033[1;31m%s\033[0m\n", $0}' terminale renklendirilmiş çıktıyı yazdırır.
  • \033[1;31m kırmızı anlamına gelir
  • \033[1;32m yeşil anlamına gelir
  • \033[1;34m mavi anlamına gelir

-W interactivemawk-belirli görünüyor . ( mawkgirişini varsayılan olarak arabelleğe alma yöntemi de benzersizdir ve -W interactivediğer awkuygulamalarda gerekli değildir ).
Stéphane Chazelas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.