출력을 필터링하는 방법을 제공하지 않는 유틸리티를 실행하고 있습니다. 출력 텍스트에는 특정 기능이 실패했음을 나타내는 내용이 없지만 빨간색으로 표시됩니다. 출력이 너무 길어서 마지막에 일부 오류를 보고할 때 항상 스크롤하여 오류가 발생한 출력을 볼 수 없습니다.
빨간색이 아닌 텍스트를 필터링하는 방법은 무엇입니까?
의사코드:
dolongtask | grep -color red
편집하다
이 명령은 필터링할 수 있어야 하는 다른 색상도 출력합니다.나가모든 텍스트아니요빨간색. 텍스트 색상도 여러 줄입니다.
답변1
색상 전환은 다음을 통해 수행됩니다.이스케이프 시퀀스텍스트에 포함되어 있습니다. 항상 절차의 문제죠ANSI 이스케이프 시퀀스, 거의 모든 터미널이 현재 이것을 지원하기 때문입니다.
전경색을 빨간색으로 전환하는 이스케이프 시퀀스에서 이스케이프 문자가 지정 \e[31m
됩니다 \e
(033 8진수, 1b 16진수, ESC라고도 함 ^[
및 기타 다양한 이름). 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'
답변2
grep을 사용하여 제어 문자를 찾을 수 있으며, 그 중 일부는 터미널에 예쁜 색상을 표시하는 역할을 합니다.
dolongtask | grep '[[:cntrl:]]'
예를 들어, 이는 grep에 빨간색 "test"를 표시하며 제어 문자로 둘러싸여 있기 때문에 이를 찾습니다.
$ echo -e '\033[00;31mtest\033[00m' | grep --color=none '[[:cntrl:]]'
test <-- in red
--color=none
grep이 일치하는 출력에 자체 색상을 적용하지 않고 쉘이 제어 문자를 해석할 수 있도록 전체 행을 충실하게 인쇄하도록 하기 위한 것입니다 .