출력을 필터링하는 방법을 제공하지 않는 유틸리티를 실행 중입니다. 출력 텍스트에 아무 것도 특정 기능이 실패했음을 나타내지 만 빨간색으로 표시됩니다. 출력이 너무 길어서 몇 가지 오류를보고 할 때 항상 오류가 발생한 출력을보기 위해 스크롤 할 수는 없습니다.
빨간색이 아닌 텍스트를 어떻게 필터링합니까?
의사 코드 :
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
바로 일치 출력에 자신의 색 지정을 적용하지 않도록 그렙를 확인하는 것입니다,하지만 충실 때문에 제어 문자가 쉘에 의해 해석됩니다 전체 행을 인쇄합니다.