stdout/stderr 컬러 출력을 정리하는 방법

stdout/stderr 컬러 출력을 정리하는 방법

다음을 출력하는 프로그램이 있습니다.

^[0;33m"2015-02-09 11:42:36 +0700 114.125.x.x access"^[0m

출력을 다음과 같이 정리할 수 있는 내장 Linux 프로그램이 있습니까?

"2015-02-09 11:42:36 +0700 114.125.x.x access"

답변1

이는 ANSI 제어 시퀀스입니다. 적어도 내가 아는 한 이러한 코드를 제거하는 내장 프로그램은 없습니다. 그러나 간단한 sed스크립트로 필요한 작업을 수행할 수 있습니다.

sed -r 's/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g'

예제 입력과 함께 위의 내용을 사용하십시오.

$ echo $'\e[0;33m"2015-02-09 11:42:36 +0700 114.125.x.x access"\e[0m'  | sed -r 's/\x1b_[^\x1b]*\x1b[\]//g; s/\x1B\[[^m]*m//g'                    
"2015-02-09 11:42:36 +0700 114.125.x.x access"

OSX 또는 기타 BSD 시스템

OSX(BSD)의 경우 sed명령을 세미콜론으로 연결할 수 없습니다. 시도 해봐:

sed -e 's/\x1b_[^\x1b]*\x1b[\]//g' -e 's/\x1B\[[^m]*m//g'

답변2

sed 스크립트에 대한 아이디어는 좋지만(이 목적에 사용할 수 있는 여러 스크립트가 있음) 제안된 스크립트는 개선될 수 있습니다.

  • 이 블록은 s/\x1b_[^\x1b]*\x1b[\]//g필터링하도록 설계될 수 있습니다.모드 명령 적용. 그러나 독자들은 이러한 사실을 발견할 가능성이 거의 없습니다.사용된, xterm 문서에 명시된 대로:

APC 백금 ST
전혀. xtermAPC 기능을 구현하지 않습니다.백금무시당하다. 백금인쇄 가능한 문자일 필요는 없습니다.

  • 밑줄이 오른쪽 대괄호로 변경되면 ]일부와 일치합니다.운영 체제 제어. 그러나 터미널에서 이들의 주요 용도는 \007(ASCII ) BEL로 끝나는 변형을 xterm 스타일 헤더(일반적으로 bash/zsh 프롬프트 문자열에서 사용됨)로 사용하는 것입니다.

이러한 요소를 고려할 때 더 나은 첫 번째 블록은 탐욕스럽지 않은 일치일 수 있습니다.escape\ 또는 BEL. 하지만 sed그리디 매칭은 이루어지게 됩니다. 복잡해지기보다는,

s/\x1b\][^\x07]*\x07//g

그 정도면 충분합니다.

다른 블록에도 문제가 있습니다. 처음부터 너무 욕심이 많음:

s/\x1B\[[^m]*m//g

애플리케이션 모드(또는 운영 체제) 명령을 제거한 후 셸 출력에 남아 있는 유일한 이스케이프 시퀀스는 비디오 모드를 변경하는 시퀀스(예: SGR(로 끝남))라고 가정하기 때문입니다 m. 약간만 변경하면 표현식은 정신을 잃지 않고 SGR 시퀀스만 필터링하고 로 시작하는 모든 항목을 제거합니다 escape[.

s/\x1B\[[;0-9]*m//g

거르는색상이스케이프 시퀀스는 터미널 출력을 일반 텍스트로 필터링하는 특별한 경우로 생각할 수 있습니다.Unix 유틸리티를 사용하여 프로그래밍 방식으로 ANSI 제어 코드를 파일에 "구울" 수 있습니까?이 질문을 받기 일주일 전이었습니다.

추가 자료:

관련 정보