다른 하위 문자열이 포함된 파일에서 하위 문자열을 검색하는 방법

다른 하위 문자열이 포함된 파일에서 하위 문자열을 검색하는 방법

다른 문자열이 포함된 파일 목록에서 문자열을 검색하고 싶습니다. 기본적으로 첫 번째 문자열이 포함된 파일 목록을 가져온 다음 해당 파일에서 다른 문자열을 검색해야 합니다.

다음 명령이 도움이 됩니다.

grep -ril './' -e "first_string" | xargs grep -i "second_string"

명령의 전반부는 다음을 포함하는 파일 목록을 제공합니다.첫 번째 문자열.

r- 재귀적으로 디렉토리로 이동

i- 검색할 문자열은 대소문자를 구분하지 않습니다.

l- 일치하는 파일 나열

후반부는 이러한 파일 경로를 사용하고 두 번째 부분을 실행하여 grep파일에 다음이 있는지 검색합니다.두 번째 문자열.

여기서는 xargs이러한 파일을 가져와서 두 번째 grep명령을 실행해야 합니다.

답변1

당신이 원하는 것 :

grep -rilZ 'first_string' . | xargs -r0 grep -Hi 'second_string'

GNU 유틸리티(이미 GNU 확장을 사용하고 있기 때문에 이미 갖고 있는 것처럼 보입니다 -r)를 가정합니다.

그건:

  • -Z및를 사용하여 xargs -0경로 목록을 안정적으로 전달합니다(Unix 계열 시스템에서 경로 목록은 0을 제외한 모든 바이트 값을 포함할 수 있지만 매우 구체적인 형식은 xargs필요 하지 않습니다).-0
  • 첫 번째 파일이 파일을 찾지 못하면 -rfor를 사용하여 xargs두 번째 파일의 실행을 피하세요(여기서 생략해도 별 문제가 되지 않습니다. 두 번째 파일이 빈 표준 입력을 grep하게 됩니다).grepgrep
  • 옵션은 옵션이 아닌 인수 앞에 배치되어야 합니다.
  • -H두 번째 옵션을 사용하여 grep파일 이름이 항상 인쇄되도록(최종적으로 파일 경로만 전달되는 경우에도) 일치하는 위치를 알 수 있습니다. grep지원되지 않는 구현 의 경우 -H대안은 /dev/null찾을 파일 목록에 추가하는 것입니다. 그런 다음 여러 파일 이름을 전달하면 항상 해당 파일 이름이 인쇄됩니다.grepgrep

답변2

find . | perl -ne 'open($fh, $_); $s1=0; $s2=0; while($line = <$fh>) { $s1=1 if($line=~/string 1/); $s2=1 if($line=~/string 2/); } ; print $_ if($s1==1 and $s2 ==1); close $fh;' | sort | uniq

(조금 길어 보이지만 한 줄에 다 들어있습니다.)

편집하다:몇 가지 설명:

  • find . |검색할 디렉터리( .)의 모든 파일 목록을 다음 명령( perl) 으로 보냅니다.
  • perl -ne 'COMMANDS'STDIN에서 수신한 모든 라인(즉, 모든 파일)을 반복하고 COMMANDS각 라인에서 실행됩니다. 각 파일의 이름은 항상 다음으로 끝납니다.$_
  • open($fh, $_); COMMANDS; close $fh;파일을 열고 filehandle에 바인딩한 다음 $fh실행 COMMANDS하고 다시 닫습니다.
  • $s1=0; $s2=0;다음 파일이 시작될 때마다 이 변수는 다시 0으로 설정됩니다. (현재 파일에서 문자열을 찾으면 1로 설정됩니다.)
  • while($line = <$fh>) { COMMANDS } ;COMMANDS파일의 모든 줄에서 실행됩니다.
  • $s1=1 if($line=~/string 1/); $s2=1 if($line=~/string 2/);string 1현재 파일에서 발견 되면 $s11이 됩니다.$s2
  • print $_ if($s1==1 and $s2 ==1);문자열이 발견되면 파일 이름을 인쇄합니다.
  • | sort | uniq파일 이름을 정렬하고 double을 필터링합니다(실제로는 필요하지 않음).

관련 정보