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