grep을 grep에 파이핑 한 후 색상 유지


140

grep'ing 후 ls 착색 유지에 비슷한 질문이 있지만 착색 grep 출력을 다른 grep에 파이프하면 착색이 유지되지 않는다는 것이 나에게 성가신 일입니다.

예를 들어 grep --color WORD * | grep -v AVOID첫 번째 출력의 색상을 유지하지 않습니다. 그러나 나를 ls | grep FILE위해 색을 유지하는 이유는 무엇입니까?


2
이 질문은 유닉스 명령어 사용법에 관한 것이기 때문에 주제가 아닌 것 같습니다. unix.stackexchange.com
Raptor

답변:


162

grep예를 들어 파이프에 쓸 때 색상 출력이 비활성화됩니다. 이 동작을 재정의 할 수 있습니다grep --color=always

올바른 명령 줄은

grep --color=always WORD * | grep -v AVOID

이것은 매우 장황합니다. 대신 선을 추가 할 수 있습니다

alias cgrep="grep --color=always"

당신에 대한 .bashrc예와 사용 cgrep의 색칠 GREP있다. 재정의 grep할 때 특정 출력에 의존하고 grepASCII 이스케이프 코드를 좋아하지 않는 스크립트에 문제가 발생할 수 있습니다 .


4
이 솔루션은 특정 운이 좋은 상황에서만 작동합니다. 아래의 andersonvom의 답변을 참조하십시오.
studog

내 경우 (우분투)에 이미 별칭이 grep있었습니다. 먼저 정의 된 위치를 alias grep='grep --color=auto변경해야합니다 ~/.bashrc.
sobi3ch

나를 위해 작동하지 않습니다-이 시나리오와 유사 stackoverflow.com/a/7640077/248616
Nam G VU

이 멋진 창의적인 아이디어는 간단하고
Nam G VU

문제는 두 번째 grep이 첫 번째 grep의 색상을 억제하지 않도록하는 방법에 관한 것입니다. 이것은 그에 대한 답변이 아닙니다.
johannes_lalala

74

충고 한마디 :

를 사용할 때 grep --color=always다음 파이프로 전달되는 실제 문자열이 변경됩니다. 다음과 같은 상황이 발생할 수 있습니다.

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

옵션이 비록 -ve '12'중간 선을 제외해야합니다, 그것은 사이에 컬러 문자가 없기 때문에 1하고 2.


을 사용 --color=auto하면 다른 곳에서 파이프하고 있다는 사실을 포착하고 색상을 완전히 억제해야하지만 목적을 어기는 것입니다. 여전히 컬러 결과를 원한다면을 사용하여 마지막 파이프에서 다시 grep 할 수 있다고 생각합니다 --color.
andersonvom

2
Mac OS X에서는 적어도 @andersonvom이 제안한 것처럼 마지막 파이프의 색상이 작동하지 않습니다. 왜 그런지 모르겠다. 제외 된 패턴을 채색 할 수 있습니까? --color=always위에서 언급 한 경고와 함께 작동합니다.
user766353

3
식에서 같은 grep 패턴이 두 번 있어야합니다. 방금 Mac에서 이것을 테스트했습니다 : http://i.imgur.com/BhmwAlF.png
andersonvom

9

파이프 끝에서 동일한 grep 명령을 반복하면됩니다.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD


2
명령을 되 돌리면 같은 결과가 나오지 않습니까? grep -v AVOID * | grep WORD
Brydon Gibson

@BrydonGibson은 아마도 많은 파이프 명령에서 작동한다는 것을 보여주는 예일뿐입니다.
Alex
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.