한 명령의 출력을 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을 사용하여 강조 표시를 다시 추가하여 모든 일치 후에 모든 강조 표시를 수행하는 것 같습니다. 그것은 다음과 같습니다:m
A
m
{
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
출력의 라인에 인쇄 전용 색상 코드를 사용하는 것입니다.