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
と小文字を区別せずに異なる色で指定するには、次のようにします。WARNING
foo
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/}
'