다른 문자열이 포함된 파일 목록에서 문자열을 검색하고 싶습니다. 기본적으로 첫 번째 문자열이 포함된 파일 목록을 가져온 다음 해당 파일에서 다른 문자열을 검색해야 합니다.
다음 명령이 도움이 됩니다.
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
- 첫 번째 파일이 파일을 찾지 못하면
-r
for를 사용하여xargs
두 번째 파일의 실행을 피하세요(여기서 생략해도 별 문제가 되지 않습니다. 두 번째 파일이 빈 표준 입력을 grep하게 됩니다).grep
grep
- 옵션은 옵션이 아닌 인수 앞에 배치되어야 합니다.
-H
두 번째 옵션을 사용하여grep
파일 이름이 항상 인쇄되도록(최종적으로 파일 경로만 전달되는 경우에도) 일치하는 위치를 알 수 있습니다.grep
지원되지 않는 구현 의 경우-H
대안은/dev/null
찾을 파일 목록에 추가하는 것입니다. 그런 다음 여러 파일 이름을 전달하면 항상 해당 파일 이름이 인쇄됩니다.grep
grep
답변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
현재 파일에서 발견 되면$s1
1이 됩니다.$s2
print $_ if($s1==1 and $s2 ==1);
문자열이 발견되면 파일 이름을 인쇄합니다.| sort | uniq
파일 이름을 정렬하고 double을 필터링합니다(실제로는 필요하지 않음).