
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
which가 grep --color
alone (from 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
and not 인 이유입니다 --color=always
.
목표가 " A
및 m
일치하는 A
문자 를 모두 포함하는 모든 줄 표시 m
"라면 가장 간단한 해결책은 하나의 egrep을 사용하여 강조 표시를 다시 추가하여 모든 일치 후에 강조 표시를 수행하는 것 같습니다. 다음과 같은 것 :
{
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
색상으로 구분된 출력의 행만 인쇄하는 데 를 사용합니다.