일치하는 라인뿐만 아니라 모든 라인을 출력하도록 grep을 설득하십시오.

일치하는 라인뿐만 아니라 모든 라인을 출력하도록 grep을 설득하십시오.

다음과 같은 파일이 있다고 가정해 보겠습니다.

$ cat test

test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4

기본적으로 grep검색어가 포함된 모든 행이 반환됩니다.

$ grep test test

test line 1
test line 2
test line 3 with two test words
test line 4

--color인수를 전달하면 grep검색 표현식과 일치하는 행 부분이 강조 표시되지만 여전히 해당 표현식이 포함된 행만 반환됩니다. grep소스 파일의 모든 줄을 출력하지만 강조 표시가 일치하는 방법이 있습니까 ?

이것을 달성하기 위한 나의 현재 끔찍한 해킹은 (적어도 일치하는 항목이 없는 10000개 이상의 연속 라인이 없는 파일에 대해) 다음과 같습니다.

$ grep -B 9999 -A 9999 test test

두 명령의 스크린샷

이것이 가능하지 않다면 grep동일한 기능을 제공하는 다른 명령줄 도구가 있습니까? 나는 그것을 만지작거렸다ack, 하지만 선택의 여지가 없는 것 같습니다.

답변1

grep --color -E "test|$" yourfile

여기서 우리가 하는 일은 $패턴과 테스트 패턴을 일치시키는 것입니다. 당연히 $색상을 지정할 것이 없으므로 테스트 패턴만 색상을 얻습니다. -E확장 정규식 일치를 활성화하면 됩니다 .

다음과 같은 함수를 쉽게 만들 수 있습니다.

highlight () { grep --color -E "$1|$" "${@:1}" ; }

답변2

ack --passthru --color string file

Ubuntu 및 Debian의 경우 ack 대신 ack-grep을 사용하세요.

ack-grep --passthru --color string file

답변3

이를 수행하는 또 다른 방법적절하게그리고가지고 다닐 수 있는with grep(허용된 답변에 두 개의 정규 표현식을 교대로 사용하는 것 외에도)는 빈 패턴(및 해당 빈 문자열)을 통해 수행됩니다. 및 스위치
와 동일하게 잘 작동해야 합니다 .-E-F표준에 따르면:

-E
    Match using extended regular expressions. 
    [...] A null ERE shall match every line.

그리고

-F
    Match using fixed strings.
    [...] A null string shall match every line.

그러니까 그냥 달리는 게 문제야

grep -E -e '' -e 'pattern' infile

그리고 각각

grep -F -e '' -e 'string' infile

답변4

ripgrep

ripgrep인수와 함께 사용됩니다 --passthru.

rg --passthru pattern file.txt

이게 그 중 하나야가장 빠른 grep 도구, 이는 기반으로 구축되었기 때문에Rust용 정규식 엔진유한 오토마타, SIMD 및 공격적인 텍스트 최적화를 사용하여 검색 속도를 매우 빠르게 만듭니다.

--passthru- 일치하는 라인과 일치하지 않는 라인을 인쇄합니다.

비슷한 효과를 얻는 또 다른 방법은 빈 문자열과 일치하도록 패턴을 수정하는 것입니다. 예를 들어, using using 을 사용하여 검색하는 경우 대신 rg foousing 은 rg "^|foo"검색된 모든 파일의 모든 줄을 내보내지만 foo 발생만 강조 표시합니다. 이 플래그는 스키마를 수정하지 않고도 동일한 동작을 달성합니다.

관련 정보