Tô màu các nguồn khác nhau cho đuôi


19

Tôi đang xem các bản ghi khác nhau bằng cách

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

Làm thế nào tôi có thể có đầu ra của mỗi bản ghi màu khác nhau?



@MattBianco cảm ơn, tôi sẽ xem xét multitailvà câu trả lời trong câu hỏi này
Daniel W.

1
Ngoài các câu trả lời tuyệt vời dưới đây, bạn cũng có thể muốn kiểm tra unix.stackexchange.com/questions/26313/colored-find-output cho biết cách thực hiện nhiều hơn với việc tô màu các tệp đầu ra.
Joe

Câu trả lời:


21

Sử dụng GNU grepđể tô màu:

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)

Lưu ý rằng 2 đầu tiên được bắt đầu trong nền. Điều đó có nghĩa là họ sẽ không bị giết nếu bạn nhấn Ctrl-C(shell rõ ràng bỏ qua SIGINT cho các công việc không đồng bộ).

Để ngăn chặn điều đó, bạn có thể làm thay thế:

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

Theo cách đó, khi Ctrl-Ccuối cùng tail+grepcatchết (của SIGINT) và hai grep + đuôi khác sẽ chết vì một SIGPIPE vào lần tiếp theo họ viết một cái gì đó.

Hoặc khôi phục trình xử lý SIGINT (sẽ không hoạt động với tất cả các 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)

Bạn cũng có thể làm điều đó trong colorchức năng. Điều đó sẽ không áp dụng cho tail, nhưng tailsẽ chết vì SIGPIPE vào lần tiếp theo khi nó viết nếu grepchết.

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)

Hoặc làm cho toàn bộ đuôi + grep một hàm:

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

Hoặc toàn bộ:

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

Khi tôi đặt đoạn mã này vào tập lệnh "watch.sh", nó sẽ quay trở lại bảng điều khiển của tôi nhưng các tin nhắn được in, xem i.imgur.com/yaiBwMo.png
Daniel W.

@Dan, xem bản chỉnh sửa
Stéphane Chazelas

Cảm ơn bạn đã nỗ lực viết câu trả lời này, tôi đã sử dụng tailcchức năng hoạt động tốt nhất và trông trực quan nhất trong kịch bản.
Daniel W.

4

Một cái gì đó như thế này làm việc cho tôi:

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

Giải trình:

  • tail -f file: chắp thêm dữ liệu khi tệp phát triển
  • awk -W interactive: đặt thành awkchế độ tương tác
  • '{printf "\033[1;31m%s\033[0m\n", $0}' in đầu ra colorzized đến thiết bị đầu cuối.
  • \033[1;31m có nghĩa là màu đỏ
  • \033[1;32m có nghĩa là màu xanh lá cây
  • \033[1;34m có nghĩa là màu xanh

-W interactivedường như là đặc mawkthù (cách mawkbộ đệm đầu vào của nó theo mặc định cũng là duy nhất và -W interactivesẽ không cần thiết trong các awktriển khai khác ).
Stéphane Chazelas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.