grep은 두 번째로 더 빠릅니다.

grep은 두 번째로 더 빠릅니다.

시간이 많이 걸리는 재귀 검색을 수행한다고 가정해 보겠습니다 grep. 결과를 본 후 다른 출력을 원합니다. 예를 들어 -C 33개의 컨텍스트 줄 옵션을 추가하고 싶습니다. 새로운 옵션을 추가해서 전체 검색을 다시 할 수는 있는데, 예전처럼 기다려야 합니다.

grep두 번째 검색을 더 빠르게 수행할 수 있는 현명한 방법이 있습니까 ?

답변1

grep파일이 운영 체제 캐시에 있어야 하므로 두 번째 시간은 이미 더 빨라야 합니다(I/O 바인딩인 경우 ).

상태가 전혀 저장되지 않고 제공된 입력 매개변수에서만 작동 하므로 grep이전 결과를 자체적으로 재사용할 수 있는 방법은 없습니다 grep.

이 문제가 자주 발생하는 경우 검색 시간을 단축하고 결과를 개선하기 위해 데스크톱 검색 엔진이나 텍스트 색인을 살펴보는 것이 좋습니다.

답변2

파일이 아직 디스크 캐시에 있으면 두 번째 검색이 더 빨라집니다.

검색 속도를 높이려면 색인을 생성해야 합니다. 이는 grep의 작업 범위를 훨씬 넘어서는 것입니다. 이는 검색 도구이지 인덱싱 도구가 아닙니다.명령줄 친화적인 전체 텍스트 인덱싱?일부 색인 도구가 나열되어 있습니다.

반복적인 검색 속도를 높이기 위해 grep을 여러 가지 방법으로 사용할 수 있습니다. 예를 들어 먼저 일치하는 파일 목록을 가져옵니다 grep -l. 파일 이름에 공백이나 쉘 와일드카드가 포함되어 있지 않으면 *?\[파일 이름을 변수에 채울 수 있습니다.

f=$(grep -l -r foo .)
grep foo $f
grep -C3 foo $f
grep foobar $f

답변3

일치하는 파일 목록을 저장하고 일치하는 파일에 대해서만 grep을 수행할 수 있습니다. 훨씬 더 빨라질 것입니다. 예를 들어 find+를 사용할 수 있습니다 grep.

find . -type f -exec grep -l 'PATTERN' {} \+ | xargs grep -H -C 3 'PATTERN'

grep첫 번째 실행 후 출력을 확인 해야 하는 경우 조금 더 어렵지만 find여전히 쉽습니다. 당신은 다음과 같은 것을 사용해야합니다

find -exec grep -H 'PATTERN' {} \+ | tee -a out.log |\
sed 's/^[^:]*://' | sort -u | xargs grep -C 3  'PATTERN'

출력은 out.log 파일에 저장됩니다.

답변4

  1. 정말 필요합니까 grep? 정규식을 사용합니까?fgrep 서둘러요.
  2. 매뉴얼 페이지에 따르면 GNU는 다음과 같이 grep말합니다. "...어떤 경우에는 --mmap이 더 나은 성능을 제공합니다..."(하지만 몇 가지 문제도 있습니다. 매뉴얼 페이지를 참조하세요).--mmap
  3. 파일을 저장하기만 하면 됩니다. 일치하는 줄의 줄 번호를 입력한 다음 반복하지 마세요 grep. 두 번 다시 할 필요는 없습니다. 그렇죠?

관련 정보