使用 perl 对尾部输出进行着色

使用 perl 对尾部输出进行着色
tail -f logfile.log | perl -pe 's/.*foo*/\e[1;41m$&\e[0m/g'    

将为 logfile.log 文件中包含模式“foo”的所有行着色。

我怎样才能利用它来突出显示精确的模式而不是整条线?

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到行尾的示例,整行包含WARNfoo但周围没有任何内容。仅应用第一个匹配规则(例如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/}
'

相关内容