발견된 파일 이름과 문자열을 표시하는 Grep

발견된 파일 이름과 문자열을 표시하는 Grep

단어 + 발견된 문자열을 포함하는 모든 파일 이름을 나열하는 egrep 명령이 필요합니다. 이 시나리오를 상상해 봅시다:

내가 찾아야 할 단어: apple, watermelon그리고 banana.

필요한 것: 그 중 하나를 포함하는 모든 파일을 나열하고(모두 같은 파일에 있을 필요는 없음) 파일에서 찾은 단어를 인쇄하고 싶습니다. 내가 원하는 검색결과의 예:

./file1.txt:apple
./file1.txt:banana
./file2.txt:watermelon
./file5.txt:apple

grep검색 결과에 표시되는 명령을 본 기억은 있지만 FILENAME:STRING어떻게 수행되었는지 기억이 나지 않습니다. 나는 시도했다:

egrep -lr 'apple|banana|watermelon' .

그러나 검색 결과는 다음과 같습니다.

./file1.txt
./file2.txt

알겠습니다. 도움이 되지만... 에서 file1찾은 단어 중 어떤 단어를 찾았나요? 그것이 바로 제가 직면하고 있는 문제입니다.

답변1

당신은 -l당신이 원하는 것과 반대되는 을 사용했습니다. 에서man grep:

-l, --files-with-matches
      Suppress normal output; instead print the  name  of  each  input
      file  from  which  output would normally have been printed.  The
      scanning will stop on the first  match.   (-l  is  specified  by
      POSIX.)

당신이 원하는 것은 -H:

-H, --with-filename
      Print the file name for each match.  This is  the  default  when
      there is more than one file to search.

그러나 그것은 어쨌든 기본값입니다. 그냥 해:

grep -Er 'apple|banana|watermelon' .

( 처럼 행동하라고 -E지시합니다 .)grepegrep

답변2

awk로 수행하는 방법:

awk -v var1=apple -v var2=banana -v var3=watermelon '{ if($0~var1) {print FILENAME":"var1} ; if($0~var2) {print FILENAME":"var2} ; if($0~var3) {print FILENAME":"var3}  }' *

기본적으로 3개의 변수와 3개의 if문을 선언하여 파일명과 발견된 해당 변수를 출력합니다.

편집하다

더 짧은 버전:

awk '/watermelon/{ print FILENAME":watermelon" }; /banana/{print FILENAME":banana"}; /apple/ {print FILENAME":apple"}' *

기본 아이디어는 /regular expression/코드를 찾은 후 중괄호 안에 있는 코드를 찾아 실행하는 것입니다(FILENAME과 찾은 문자열을 인쇄하는 것입니다).

답변3

찾고 있는 명령은 다음과 같습니다.

grep -R "apple\|banana\|watermelon" <search_path>

-R은 각 디렉토리 아래의 모든 파일을 읽습니다.검색_경로, 재귀적으로. 각 일치 항목에 대해 파일 이름이 표시됩니다.

답변4

다음은 원하는 출력을 제공합니다(bash 사용).

for x in apple banana watermelon ; do grep $x * ; done

출력에는 검색 문자열이 포함된 모든 줄이 표시됩니다.

다음은 검색 문자열만 출력으로 제공합니다.

for x in apple banana watermelon ; do grep -l $x * |xargs -I{} echo {}:$x; done

관련 정보