Command-Line
為尾巴著色不同的來源
我正在看不同的日誌
tail -q -f /var/log/syslog -f /var/log/fail2ban.log -f /var/log/nginx/error.log
如何使每個日誌的輸出顏色不同?
使用 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
(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
這樣,在上,(SIGINT
Ctrl-C
的)最後一個tail+grep
和cat
die 以及另外兩個 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
函式中執行此操作。這不適用於SIGPIPEtail
,但tail
如果死了,它會在下次寫入時grep
死於 SIGPIPE。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