Perlを使用したテール出力のカラー化

Perlを使用したテール出力のカラー化
tail -f logfile.log | perl -pe 's/.*foo*/\e[1;41m$&\e[0m/g'    

「foo」パターンを含むlogfile.logファイルのすべての行は色で表示されます。

ライン全体ではなく正確なパターンを強調するにはどうすればよいですか?

echo "WARN ERROR foo"|sed 's#WARN#\x1b[33m&#; s#ERROR#\x1b[31m&#; s#foo#\x1b[32m&#'    

私の言葉は、私がこのようなことをしたいとしたらどうしますか?

答え1

sedまず、Perlを次&のように変更して使用できます$&

echo "WARN ERROR foo" | 
    perl -pe 's#WARN#\x1b[33m$&#; s#ERROR#\x1b[31m$&#; s#foo#\x1b[32m$&#'    

または、元のPerlアプローチを使用して.*一致させたいパターンの側面を削除するだけです。

tail -f logfile.log | perl -pe 's/foo/\e[1;41m$&\e[0m/g'    

より一般的なアプローチのために、私が投稿した小さなスクリプトを使うことができます。私の答えはここにあります。このアプリを使用すると、それぞれ異なる色で最大10パターンを塗りつぶすことができます。たとえば、単語、およびを大文字ERRORと小文字を区別せずに異なる色で指定するには、次のようにします。WARNINGfoo

tail -f logfile.log | color.pl -il "error,warning,foo"

答え2

ERROR以下は、行全体が含まれているが周囲に何も含まれていないまま行から最後までWARN強調foo表示される例です。最初の一致ルールのみが適用されます(たとえば、赤にWARN: ERROR foo設定)。必要に応じて調整します。ERROR foo

perl -pe 's/ERROR.*/\e[31m$&\e[0m/ || s/.*WARN.*/\e[33m$&\e[0m/ || s/foo/\e[32m$&\e[0m'

キーワードを強調表示する場合は、別の方法はキーワードの色を決定する関数を呼び出すことです。 (この例は前の例と異なる点を実行します。つまり、常に行全体を強調表示します。)

perl -pe '
    sub color {
         my ($keyword) = @_;
         $keyword =~ /err/i ? 31 :
         $keyword =~ /warn/i ? 33 :
         32;
    }
    if (/(ERROR|WARN|foo)/) {$color=color($1); s/^/\e[${color}m/; s/$/\e[0m/}
'

関連情報