grep : 모든 출력을 표시하지만 검색 일치를 강조 표시합니다


42

bash에서 명령을 실행하고 특정 패턴과 일치하는 출력 줄만 표시하려면 다음 grep과 같이 파이프로 연결할 수 있습니다.

파일 테스트 파일

hello
there
my
friends

명령

$ cat testfile | grep 'hello'
hello #this will be highlightd

검색 일치를 강조 표시하고 전체 줄을 표시합니다. 해당 줄 전후에 줄을 사용 -A하고 -B표시 할 수 있습니다 . 내 질문은 명령을 실행하고 모든 출력을 정상적으로 표시하는 것이 가능하지만 grep처럼 검색 일치를 강조 표시하는 것입니까? 그래서 내 출력은

hello #highlighted
there
my
friends

답변:


38

컬러 GREP을 사용하여 일치하는 패턴 만 강조하고 출력을 변경하지 않으려면

grep --color=always -e "^" -e "hello" testfile

첫 번째 패턴은 모든 행과 일치하며 (모든 행이 인쇄 됨) 두 번째 패턴 (및 다음 패턴)은 일치하는 텍스트가 컬러로 강조 표시됩니다.

첫 번째 패턴은 모든 행과 일치하지만 인쇄 가능한 문자와 일치하지 않으므로 색상 강조 표시를 추가하지 않으므로 강조 표시된 텍스트의 가독성을 경쟁하거나 방해하지 않습니다.


kubectl apply -k . | grep --color=always -e "^" -e "configured"zsh에서 kubectl과 함께 작동
Michael Cole

Bash에서 사용하기 : highlight () {grep --color = always -e "^"-e $ *; }
Jon

이것은 FreeBSD에서도 작동합니다. 첫 번째와 두 번째 patern을 바꾸면됩니다 ( "^"두 번째 여야 함).
Marián Černý

25

-zGNU grep 명령에 옵션 을 추가하십시오 :

cat testfile | grep --color=always -z 'hello'

또는 더 짧은

grep --color=always -z 'hello' testfile

3
이것은 매우 조잡한 해킹입니다. 전체 파일을 한 줄로 처리하는 효과가 있습니다. 파일이 매우 큰 경우 파일이 패턴을 포함하지 않는 경우 따라서 (1), 메모리 부족의 가능성, 그리고 (2)이있을 수 있습니다 에 모두를 , 다음 아무것도 출력되지 않습니다.
G-남자 '는 분석 재개 모니카'말한다

어떤 버전의 grep이 지원됩니까? grep 2.5.4에서 -z를 사용할 수없는 것 같습니다.
Alex

@ Alex : GNU grep 버전 2.6.3을 사용했습니다.
Cyrus

2
@ G-Man : 더 많은 자원 절약 :grep --color "hello\|$" file
Cyrus

@Cyrus : 예, 더 나은 대답입니다. 불행하게도, 그것은 이 질문에 대한 bot779의 답변 과 본질적으로 동일하며 , 내가 연결 한 질문에 대한 허용 된 답변 ( 12 ) 과 거의 동일 합니다.
G-남자 '는 분석 재개 모니카'말한다

5

이전 답변과 마찬가지로 모든 $줄 끝을 잡을 수 있습니다 .

cat testfile | grep --color -E "hello|$"

-E(또는 --extended-regexp)는 특수 문자를로 이스케이프해야 함을 의미합니다 \. 사용시 |정규식 "OR"상태로 취급됩니다.

Grep |$은 끝이있는 모든 줄을 잡아서 인쇄하지만 $는 숨겨진 문자이므로 강조 표시 할 수 없습니다.

최신 정보:

일치 여부에 관계없이 모든 출력인쇄하고 종료 코드도 반환 하려면 perl 명령을 사용할 수 있습니다.

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

sed 를 선호하는 경우 -다음은 모든 일치 항목강조 표시 하는 방법 과 일치하는 항목이 없으면 종료 종료 코드를 반환 하는 방법입니다 . https://askubuntu.com/a/1200851/670392


2

이것은 GNU grep 및 FreeBSD의 grep과 함께 작동합니다.

grep --color=always 'hello\|$'

텍스트 "hello"또는 ( \|)는 각 줄 끝에 인쇄 할 수없는 null 문자열 과 일치합니다 ( $). 그렇기 때문에 각 줄이 인쇄되지만 "hello"만 강조 표시됩니다.

--color=auto쉘에서 이미 구성 했을 가능성이 있습니다 . 그런 다음 대부분을 지정할 필요가 없습니다 --color=always.

grep 'hello\|$'

"또는"표현식을 이스케이프 할 필요가없는 egrep확장 정규 표현식 을 사용하여 더 간단한 버전을 사용할 수도 |있습니다.

egrep 'hello|$'

이것은 모든 입력 라인을 표시하는 방법에 대한 답변이 아닙니다.
Chris 페이지

@ChrisPage 나는 그것을 말할 것입니다 : 그것이 각 줄이 인쇄 되지만 "hello"만 강조 표시되는 이유 입니다.
Marián Černý

0

위의 최상위 답변에 추가하십시오. 주석에 언급 된 highlight {} 함수는 데이터가 파이프로 전달 될 때만 작동합니다. 완벽하지는 않지만 다음 별칭이 더 유용합니다.

alias greph="grep --color=always -e^ -e"

이것은 다음과 같은 명령에서 작동합니다.

greph foo bar.txt

cat bar.txt | greph foo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.