尾のさまざまな起源を着色

尾のさまざまな起源を着色

さまざまなログを見ています。

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

各ログの出力を異なる色にするにはどうすればよいですか?

ベストアンサー1

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つはバックグラウンドで実行されます。つまり、SIGINT を押すと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

このように、SIGINTのCtrl-C最後の1つとtail+grepdiecatと他の2つのgrep + tailは、次に何かを書くとSIGPIPEで死にます。

または、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次にtailifが作成されると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

おすすめ記事