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
,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/}
'