고쳐 쓰다:

고쳐 쓰다:

한 명령의 출력을 grep다른 명령으로 파이프하고 있습니다 grep. 첫 번째 일치 항목에 색상이 지정되도록 첫 번째 항목이 grep사용됩니다 . --color=always실제로 이는 두 가지 색상 코드(예: \033[1;31m및 ) 사이에 일치 항목이 포함되어 있음을 의미합니다 \033[0m.

이제 문제는 두 번째 패턴이 이면 m이전 일치 항목의 색상 코드와 일치한다는 것입니다.

echo A B C | grep --color=always A | grep m

마찬가지로 숫자도 31일치합니다.

이 문제를 해결할 방법이 있나요?

고쳐 쓰다:

성냥에 색을 칠해야 한다는 것은 말할 필요도 없기 때문에 --color=always성냥을 제거하는 것은 나에게 만족스러운 해결책이 아닙니다.

답변1

를 사용하지 마십시오 grep --color=always. 그렇기 때문에 GNU grep(및 어쩌면 다른 것)에도 별도의 grep --color=auto상응하는 항목이 있습니다 grep --color( man grep).

   --color[=WHEN], --colour[=WHEN]
          Surround  the  matched  (non-empty)  strings,  matching   lines,
          context  lines,  file  names,  line  numbers,  byte offsets, and
          separators (for fields and groups of context lines) with  escape
          sequences  to display them in color on the terminal.  The colors
          are  defined  by  the  environment  variable  GREP_COLORS.   The
          deprecated  environment  variable GREP_COLOR is still supported,
          but its setting does not have priority.  WHEN is never,  always,
          or auto.

더 자세히 문서화되어 있는 것을 찾을 수는 없지만 기본적으로 출력이 grep파일, 터미널, 파이프 또는 기타인지 여부를 감지하고 그에 따라 작동합니다.

$ echo foo | grep --color=always o | grep m
f[01;31mo[m[01;31mo[m
$ echo foo | grep --color=always o >outfile; grep m outfile
f[01;31mo[m[01;31mo[m

위의 비교

$ echo foo | grep --color o >outfile; grep m outfile
$ echo foo | grep --color o | grep m 
$ 

따라서 이 auto옵션을 사용하면 기본적으로 볼 수 있는 색상만 인쇄됩니다. 정말 영리하고 매력처럼 작동합니다. 나는 다음과 같은 것을 가지고 있습니다:

$ type grep
grep is aliased to `grep --color'

답변2

--color가치가 있는 것이 바로 --color=auto기본값이 이고 아닌 이유입니다 --color=always.

목표가 " 일치하는 합계 문자를 포함 A하고 강조 표시하는 모든 행을 표시하는 것 "이라면 가장 간단한 해결책은 egrep을 사용하여 강조 표시를 다시 추가하여 모든 일치 후에 모든 강조 표시를 수행하는 것 같습니다. 그것은 다음과 같습니다:mAm

{
    echo "A b";
    echo "A m";
    echo "B m";
    echo "Another m";
} | grep 'A' | grep 'm' | egrep --color 'A|m';

답변3

실제 사용 사례는 무엇입니까? A포함된 모든 행에서 색상 코드를 사용 하려면 간단히 s를 m반대로 하면 됩니다 .grep

echo A B C | grep m | grep --color=always A

또는 원시 출력에서 ​​텍스트를 찾는 경우 m이전 색상 코드를 모두 제외 grep m하되 결과를 인쇄 해야 합니다.그리고색상 코드. 이를 수행하는 한 가지 방법은 nl출력 라인에 번호 매기기를 사용 하고 grep뒤에 오는 라인 번호에 대해 m해당 출력의 라인 번호만 저장한 다음 sed -n출력의 라인에 인쇄 전용 색상 코드를 사용하는 것입니다.

관련 정보