it-swarm.dev

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

Screenshot of the two commands

grep가이를 수행 할 수없는 경우 동일한 기능을 제공하는 다른 명령 줄 도구가 있습니까? 나는 ack 으로 바이올린을 썼지 만 옵션도없는 것 같습니다.

127
Michael Mrozek
grep --color -E "test|$" yourfile

우리가 여기서하는 것은 $ 패턴과 테스트 패턴, 분명히 $ 색상을 지정할 항목이 없으므로 테스트 패턴 만 색상을 얻습니다. -E 확장 정규식 일치 만 켭니다.

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

highlight () { grep --color -E "$1|$" "${@:1}" ; }
194
jacksonh
ack --passthru --color string file

ubuntu 및 Debian의 경우 ack 대신 ack-grep을 사용하십시오.

ack-grep --passthru --color string file

grep을 사용하여 적절하게 휴대용 을 수행하는 다른 방법 허용 된 답변에서와 같이 대체 된 정규 표현식은 null 패턴 (및 각각 null 문자열)을 통해 이루어집니다.
표준에 따라 이후 -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
13
don_crissti

그런 것들에 사용하는 다음 기능이 있습니다.

highlight () {
    Perl -pe "s/$1/\e[1;31;43m$&\e[0m/g"
}

내부적으로는 추악한 것처럼 보이며 다음과 같이 멋지고 사용하기 쉽습니다.

cat some_file.txt | highlight some_Word

또는 좀 더 실제적인 예를 들면 다음과 같습니다.

tail -f console.log | highlight ERROR

13143을 변경하여 원하는대로 색상을 변경할 수 있습니다 (grep로는 어려울 수 있습니다-확실하지 않습니다). (\e[ 뒤에) 다른 값으로 사용할 codesall 이상 장소 이지만, 여기에 빠른 소개가 있습니다. 1은 텍스트를 굵게 표시하고 31는 빨간색으로, 43은 노란색 배경을 나타냅니다. 32 또는 33은 다른 색상이되고 44 또는 45은 다른 배경이됩니다. 아이디어를 얻습니다. 기울어 져 있으면 깜박일 수도 있습니다 (5 사용).

이것은 특별한 Perl 모듈을 사용하지 않으며 Perl은 nearly 편재하므로 어디서나 작동 할 것으로 기대합니다. grep 솔루션은 매우 영리하지만 grep의 --color 스위치를 모든 곳에서 사용할 수는 없습니다. 예를 들어 방금 bash를 실행하는 Solaris 상자와 ksh를 실행하는 다른 상자 및 zsh를 실행하는 로컬 Mac OS X 시스템 에서이 솔루션을 시도했습니다. 모두 잘 작동했습니다. 그러나 솔라리스는 grep --color 솔루션에 질식했습니다.

또한 ack는 훌륭하며 아직 그것을 발견하지 못한 사람에게 추천하지만, 내가 작업하는 많은 서버 중 일부에 설치하는 데 약간의 문제가 있습니다. (이유를 잊어 버렸습니다 : 필요한 Perl 모듈과 관련이 있다고 생각합니다.)

everdid n't 유닉스 박스에서 펄을 설치했다고 생각하지 않기 때문에 (내장형 시스템을 제외하고, Linksys 라우터 및 기타) 나는 이것이 보편적으로 사용 가능한 솔루션이라고 말합니다.

11
iconoclast

Grep을 사용하는 대신 Less를 사용할 수 있습니다.

less file

다음과 같이 검색하십시오. /pattern Enter

이것은 :

  1. 첫 번째 일치하는 줄로 스크롤
  2. 거기서부터 모든 라인을 출력
  3. 모든 경기를 강조

다음 일치하는 줄로 스크롤하려면 : n

이전 일치하는 줄로 스크롤하려면 : N

강조 표시를 토글하려면 : Esc u

원하는 경우 강조 표시 색상 을 변경할 수도 있습니다.

3
Steven Penny

당신은 시도 할 수 있습니다:

Perl -MTERM::ANSIColor -nle '/pattern/ ? print colored($_, 'color') : print' test

그러나 이식성이 떨어지고 Perl이 설치되어 있어도 다른 모듈을 다운로드해야 할 수도 있습니다. 또한 검색 단어뿐만 아니라 전체 줄을 색칠합니다.

2
gvkv

지금까지 주어진 답변 중 어느 것도 이식 가능 솔루션을 제공하지 않습니다.

휴대용입니다1 쉘 함수 I 이미 게시 됨Perl, ack, ggrep, gsed, bash 등은 POSIX 셸 및 POSIX 필수 유틸리티 sedprintf 만 필요합니다.

grepc()
{
  pattern=$1
  shift
  esc=$(printf "\033")
  sed 's"'"$pattern"'"'$esc'[32m&'$esc'[0m"g' "[email protected]"
}

그런 식으로 사용할 수 있습니다.

grepc string_to_search [file ...]

Sed 명령 인수에서 다음 코드 중 하나를 사용하여 강조 색상을 조정할 수 있습니다 (32m은 녹색).

30m black
31m red
33m yellow
34m blue
35m Magenta
36m cyan
37m white
7m reverse video

1 터미널이 ANSI 색상 이스케이프 시퀀스를 지원하는 한.

2
jlliagre

ripgrep

ripgrep--passthru 매개 변수 :

rg --passthru pattern file.txt

Rust 's regex engine 위에 빌드되기 때문에 가장 빠른 grepping 도구 중 하나입니다.

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

비슷한 효과를 얻는 또 다른 방법은 빈 문자열과 일치하도록 패턴을 수정하는 것입니다. 예를 들어 rg foo 그런 다음 rg "^|foo" 대신 검색된 모든 파일에서 모든 줄을 내보내지만 foo 항목 만 강조 표시됩니다. 이 플래그는 패턴을 수정할 필요없이 동일한 동작을 가능하게합니다.

2
kenorb

GNU grep)에 대해 훨씬 쉬운 방법이 있지만 이식성이 있다고 생각하지 않습니다 (예 : BSD grep).

파이프에서 :

cat <file> | grep --color=always -z <query>

파일에서 :

grep --color=always -z <query> <file>

크레딧은 여기서 사이러스의 대답 으로갑니다.

1
Erik Nomitch

sed 버전은 bashash에서 모두 작동합니다.

#highlight
hsed(){
    local pattern="$1"
    shift
    local r=`echo -e '\e'[31m`
    local c=`echo -e '\e'[0m`
    sed "s:${pattern//:/\:}:$r\0$c:g" "[email protected]"
}
0
yurenchen

OP는 grep을 (를) 요청했습니다. 이것이 바로 I RECOMMEND; 그러나 sed의 문제를 해결하기 위해 열심히 노력한 후에는 다음과 같은 간단한 해결책이 있습니다.

sed $'s/main/\E[31m&\E[0m/g' testt.c

또는

cat testt.c | sed $'s/main/\E[31m&\E[0m/g'

main을 빨간색으로 페인트합니다.

  • \E[31m : 붉은 색 시작 순서
  • \E[0m : 완성 된 컬러 마크
  • & : 일치하는 패턴
  • /g : 첫 번째 단어뿐만 아니라 한 줄의 모든 단어
  • $'string'는 이스케이프 문자가 해석되는 bash 문자열입니다.

grep와 관련하여 ^ (줄 끝) 대신 $ (줄 시작)를 사용하여 작동합니다. 예:

egrep "^|main" testt.c

그리고이 미친 별명을 보여주기 위해 권장하지 않음, 따옴표를 열 수도 있습니다.

alias h='egrep -e"^|'
h main" testt.c
cat testt.c | h main"

모든 일! :) 따옴표를 닫는 것을 잊어 버려도 걱정하지 마십시오. bash는 "계속되는 줄 문자"를 기억합니다.

0
Dr Beco