我正在观看不同的日志
tail -q -f /var/log/syslog -f /var/log/fail2ban.log -f /var/log/nginx/error.log
如何使每个日志的输出具有不同的颜色?
答案1
使用 GNUgrep
进行着色:
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(shell 显式忽略异步作业的 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
die (SIGINT 的)以及其他两个 grep+tail 将在下次写东西时死于 SIGPIPE。
或者恢复 SIGINT 处理程序(不适用于所有 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)
您也可以在color
函数中执行此操作。这不适用于tail
,但tail
下次写入 if 时会因 SIGPIPE 而死亡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)
或者让整个 tail+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
或者整个事情:
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
答案2
像这样的事情对我有用:
(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
意味着蓝色