grep 입력으로 색상 코드를 유지하려면 어떻게해야합니까?


15

두 개의 연속 grep명령을 사용하는 경우 예 :

echo "foo bar" | grep foo | grep bar

그런 다음 첫 번째 패턴 ( "foo")이 강조 표시되지 않습니다. 실제로 grep은 입력에서 색상 코드를 제거하는 것으로 보입니다. 이것을 막을 방법이 있습니까?


같은 대답을 가진 또 다른 질문 : bash 함수 내에서 grep으로 컬러 출력을 어떻게 복원 할 수 있습니까?
Camille Goudeseune

답변:


23

사용하십시오 --color=always.

grep출력이 파이프 (또는 파일)에 있는지 감지합니다. 출력은 파일로 출력 될 때 색상을 원하지 않습니다. 즉, 터미널의 이스케이프 시퀀스입니다. 일반적으로

foo ^[[01;31m^[[Kbar^[[m^[[K

예를 들어 :

grep pattern file > result

재정의하려면을 사용하십시오 --color=always.

grep --color=always pattern file | ...

예:

파일 있음 :

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz

그때

grep --color=always ID file | grep --color=always 2013 | grep foo

색상 것 ID, 2013하고 foo.

grep --color=always ID file | grep 2013 | grep foo

색상 것 ID하고 foo있지만 2013.

1 중요 : 또한색상에서 추가 된 혼란 이 체인의 다음 명령으로 전달됨을기억해야합니다. ID에 색상이 지정되면 (쉽게) 일치 할 수 없습니다 (예 :)ID=111.


경우에 따라 파일에서 터미널 색상 원할 수도 있습니다 . 예를 들어보십시오

 grep --color=always foo file > result
 cat result

결과 파일은 이식성이 매우 제한적입니다.


착색 자체도 확장입니다.


good @slm 에서 언급했듯이 다음을 추가 할 수 있습니다.

export GREP_OPTIONS="--color=always"

당신에 .bashrc등, 하지만하지 않습니다 당신이하지 않는 몇 가지 이유가 정말로 의미를 이해하고 아직도하고 싶은 위해. 그것은 grep위에서 언급 한 사실 때문에 여러 가지면에서 깨질 것입니다 1 .

alias자주 사용 하는 경우 추가하십시오 .

 alias cgrep='grep --color=always'

GREP_OPTIONS그리고 --color 세 가지 옵션을 : never, autoalways. 두 개의 첫 번째 만이 고려되어야합니다 GREP_OPTIONS.

또한 체크 아웃 할 수 GREP_COLORS에서 man페이지 또는에서 의 GNU 그렙 .


이 방법에 대한 자세한 내용은 여기 / 장점 : stackoverflow.com/questions/867877/…
slm

1
이것도 대답에 추가하십시오 : export GREP_OPTIONS="--color=always".bashrc에서는 옵션을 모든 greps의 기본값으로 설정하고 거의 못 박았습니다!
slm

이 Super Uuser Q & A의 좋은 점 : superuser.com/questions/36022/…
slm

"grep은 출력이 파이프인지를 감지합니다"-aha! 이것이 핵심이며, grep이 파이프의 일부라면 색칠하지 않습니다. 이런 종류의 것에 반대하는 대체 원칙이 있어야합니다 :-/
Chris2048

@ Chris2048 : 터미널에 색상을 인쇄하는 대부분의 도구에 대한 표준입니다. 당신은 좀 더 상세하게 찾을 수있는 이로 가 감지 방법을, 그리고 이것이 OSX 기본에 예를 들어, LS 및 색상에 의해 몇 가지 문제 표시 ls와 GNU로 coreutils을.
Runium
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.