N번째 파일 일치 후 grep 중지

N번째 파일 일치 후 grep 중지

특정 문자열을 검색해야 하는 파일이 많이 있습니다. grep -rl 'pattern' *패턴이 포함된 파일을 찾는 데 사용합니다 . 그러나 나는 파일 수에만 관심이 있습니다. 문자열이 N개 이상의 파일에 나타나는 경우 N번째 일치 항목에 도달하자마자 grep을 중지하고 싶습니다(전체 파일 계층 구조를 검색하는 것은 긴 작업이므로). 의미 있는 종료 코드를 반환했다면 좋겠지만, 이것이 가능하지 않다면 문제 없이 파이프로 연결할 수 있습니다 wc.

N번째 파일을 일치시킨 후 grep에게 다른 파일 검색을 중지하도록 어떻게 지시합니까?

답변1

grep결과 를 head.

N번째 일치 후에 중지되도록 하려면 다음을 사용하여 출력이 버퍼링되지 않도록 stdbuf해야 합니다.grep

stdbuf -oL grep -rl 'pattern' * | head -n10

head10개의 행이 소비되면 사라지 더라도 여전히 파이프에 무언가를 출력하기 grep때문에 종료되고 수신됩니다 .SIGPIPEhead

이는 파일 이름에 개행 문자가 포함되어 있지 않다고 가정합니다.

답변2

이것이 정확히 귀하가 요구하는 것은 아니지만 사용되는 파일 수를 고려하면 파일 크기 등에 따라 스크립트 시간이 달라질 수 있으므로 이것이 귀하의 요구에 적합할 수 있다고 생각합니다. 제한하려는 방법을 확인하십시오. 처리 시간, 당신은 할 수 있습니다

timeout -k 1m grep -rl 'pattern' *

스크립트를 빠르게 실행하기 위해 처리된 파일 수를 계산하는 대신 지정된 시간이 경과한 후 실제로 명령을 닫습니다. 내 코드 예제에서는 1분이지만 1m을 올바른 해당 접미사로 바꾸면 초(s) 시(h) 또는 심지어 일(d)로 변경할 수 있습니다. 예를 들어 한 시간 동안 실행해 보겠습니다.

timeout -k 1h grep -rl 'pattern' *

이것이 다른 사람에게 도움이 되기를 바랍니다!

답변3

pure grep는 아니지만 다음을 갖습니다 bash.

i=0
grep -rl 'pattern' * | while read l ; do
  i=$(($i+1))
  echo $l
  if [ $i -ge N ] ; then 
    echo "at least N matches"
    break
  fi
done

일치하는 파일 수가 일치하는 임계값보다 훨씬 많으면 속도가 더 빨라집니다 N.

관련 정보