![발견된 파일 이름과 문자열을 표시하는 Grep](https://rvso.com/image/1127637/%EB%B0%9C%EA%B2%AC%EB%90%9C%20%ED%8C%8C%EC%9D%BC%20%EC%9D%B4%EB%A6%84%EA%B3%BC%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%ED%91%9C%EC%8B%9C%ED%95%98%EB%8A%94%20Grep.png)
단어 + 발견된 문자열을 포함하는 모든 파일 이름을 나열하는 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
지시합니다 .)grep
egrep
답변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