다음과 같은 파일이 있다고 가정해 보겠습니다.
$ 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 foo
using 은rg "^|foo"
검색된 모든 파일의 모든 줄을 내보내지만 foo 발생만 강조 표시합니다. 이 플래그는 스키마를 수정하지 않고도 동일한 동작을 달성합니다.