색상 별 명령 출력 필터링


13

출력을 필터링하는 방법을 제공하지 않는 유틸리티를 실행 중입니다. 출력 텍스트에 아무 것도 특정 기능이 실패했음을 나타내지 만 빨간색으로 표시됩니다. 출력이 너무 길어서 몇 가지 오류를보고 할 때 항상 오류가 발생한 출력을보기 위해 스크롤 할 수는 없습니다.

빨간색이 아닌 텍스트를 어떻게 필터링합니까?

의사 코드 :

dolongtask | grep -color red

편집하다

이 명령은 물론 다른 색상을 출력하고, 나는 필터링 할 수 있어야합니다 밖으로 모든 텍스트 되지 않은 빨간색을. 또한 텍스트 채색은 여러 줄입니다.


1
나는 명백한 질문을 한 것에 대해 사과하지만 모든 출력이 켜져 >&1있습니까? 내 말은, 만약 당신이 붉은 물건은 사라지지 않는 것입니다 2>/dev/null.
mikeserv 2016

답변:


15

색상 전환은 텍스트에 포함 된 이스케이프 시퀀스를 통해 수행 됩니다. 사실상 , 프로그램은 ANSI 이스케이프 시퀀스를 발행 합니다 . 요즘 거의 모든 터미널이 지원하기 때문입니다.

적색 전경 색상을 전환 할 이스케이프 시퀀스 인 \e[31m경우, \e(033,도 진수 ESC라고도 1B, 진수 제어 문자를 지정 ^[하고 다양한 다른 명칭). 30-39 범위의 숫자는 전경색을 설정합니다. 다른 숫자는 다른 속성을 설정합니다. \e[0m모든 속성을 기본값으로 재설정합니다. cat -v프로그램이 인쇄하는 것을 확인하기 위해 실행하십시오. \e[0;31m먼저 모든 속성을 재설정하거나 \e[3;31기울임 꼴을 켜는 등 많은 변형을 사용할 수 있습니다 (많은 터미널이 지원하지 않는).

ksh, bash 또는 zsh에서는 $'…'따옴표 안에 백 슬래시 이스케이프를 활성화 $'\e'하여 이스케이프 문자 를 입력 할 수 있습니다 . 그런 다음 전달하려는 백 슬래시를 두 배로 늘려야합니다 grep. 에서가 /bin/sh, 당신은 사용할 수 있습니다 "$(printf \\e)"또는 문자 이스케이프 문자를 입력합니다.

는 GNU와 함께 grep -o옵션, 다음 코드는 이스케이프 시퀀스로 시작한다고 가정, 빨간색 텍스트 필터 \e[31m와 하나 끝 \e[0m이나 \e[30m하고, 같은 줄에 더 이스케이프 시퀀스 임베디드 포함.

grep -Eo $'\e\\[31m[^\e]*\e\\[[03]?m'

다음 awk스 니펫은 여러 줄인 경우에도 빨간색 텍스트를 추출합니다.

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        red = (color ~ /1;*$/)
    }
    red'

색상 변경 명령을 유지하는 변형이 있습니다. 여러 색상 (여기서 빨간색과 자홍색)을 필터링 할 때 유용 할 수 있습니다.

awk -v RS='\033' '
    match($0, /^\[[0-9;]*m/) {
        color = ";" substr($0, 2, RLENGTH-2) ";";
        printf "\033%s", substr($0, 1, RLENGTH);
        $0 = substr($0, RLENGTH+1);
        gsub(/(^|;)0*[^03;][0-9]*($|;)/, ";", color);
        desired = (color ~ /[15];*$/)
    }
    desired'

awk 솔루션이 나를 위해 일했습니다. 출력에서 색상을 유지하는 방법은 무엇입니까?
km6zla

@ ogc-nick 모든 빨간색 출력을 원하십니까? printf '\e[31m'; awk …; printf '\e[0m'
Gilles 'SO- 악한 중지'

필터링 할 색상에 상관없이 출력에 유지됩니다.
km6zla

@ ogc-nick 내 편집을 참조하십시오.
질 'SO-정지 존재 악마'

6

grep이 제어 문자를 찾도록 할 수 있으며, 일부는 터미널에서 예쁜 색상을 만드는 역할을합니다.

dolongtask | grep '[[:cntrl:]]'

예를 들어, 이것은 grep에 빨간색 "테스트"를 에코합니다. 이는 제어 문자로 둘러싸여 있기 때문입니다.

$ echo -e '\033[00;31mtest\033[00m' | grep --color=none '[[:cntrl:]]'
test     <-- in red

--color=none바로 일치 출력에 자신의 색 지정을 적용하지 않도록 그렙를 확인하는 것입니다,하지만 충실 때문에 제어 문자가 쉘에 의해 해석됩니다 전체 행을 인쇄합니다.


좋은. 더 나아갈 수 있는지, 특히 빨간색을 테스트 grep -E $'\033\[0?[01];31m.+?\033\[0?0m'하거나 grep -Po '\033\[0?[01]+;31m\K.+?(?=\033\[0?0m)'테스트 할 수 있는지 궁금합니다 .
steeldriver

나는 당신이 제안하는 것과 같은 정규 표현식을 생각해 냈습니다 [[:cntrl:]]. 나는 당신을 테스트했고 그들은 나를 위해 일합니다. 빨간색과 일치하고 다른 색상과 일치하지 않습니다.
savanto

잘 작동하지만 모든 색상과 일치합니다. 나는 질문에서 언급하지 않았지만 다른 많은 색상도 출력되며 빨간색을보고 싶습니다. 간단하고 작동하는 코드의 경우 +1
km6zla
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.