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

관련 정보