[unix] 색상 별 명령 출력 필터링

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

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

의사 코드 :

dolongtask | grep -color red

편집하다

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



답변

색상 전환은 텍스트에 포함 된 이스케이프 시퀀스를 통해 수행 됩니다. 사실상 , 프로그램은 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'


답변

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

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

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

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

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


답변