GN⁺: Ripgrep, grep, ag, Git grep, ucg, pt, sift보다 빠른 검색 기술 (2016년)
(blog.burntsushi.net)요약: 새로운 명령줄 검색 도구 ripgrep 소개
-
ripgrep
은 The Silver Searcher의 사용성과 GNU grep의 성능을 결합한 새로운 명령줄 검색 도구임. - 리눅스, 맥, 윈도우용 바이너리를 제공하며 Rust로 작성됨.
- 단일 파일 및 대규모 디렉토리 검색에서 성능과 정확성 면에서 뛰어남.
- 유니코드 지원이 탁월하며, 메모리 맵을 사용하는 도구보다 일반적으로 더 빠름.
ripgrep 소개
장점
- 다른 검색 도구보다 빠르며,
.gitignore
에 의해 무시되는 파일은 검색하지 않음. - 특정 파일 유형만 검색하거나 제외하는 기능 제공.
-
grep
의 많은 기능을 지원하며, 유니코드를 항상 지원함. - PCRE2 정규 표현식 엔진을 선택적으로 사용할 수 있음.
- 다양한 텍스트 인코딩과 압축된 파일 검색 지원.
- 임의의 입력 전처리 필터 지원.
반대 의견
- POSIX 표준을 준수하지 않으며,
grep
보다는 보편적이지 않음. - 다른 도구에 있는 특정 기능이나 버그가 ripgrep에는 없을 수 있음.
- 성능의 특정 엣지 케이스에서 ripgrep이 다른 도구보다 느릴 수 있음.
설치
-
ripgrep
의 바이너리 이름은rg
이며, 다양한 플랫폼에서 설치 가능. - Homebrew, Archlinux, Rust 프로그래머를 위한 설치 방법 제공.
- 소스에서 직접 빌드하는 것도 가능.
빠른 투어
-
ripgrep
의 명령줄 사용법은 다른 유사한 도구와 크게 다르지 않음. - 터미널 출력, 색상, 줄 번호 표시 등을 자동으로 지원.
- 다양한 검색 옵션과 패턴을 사용하여 검색 가능.
ripgrep의 구조
배경
-
grep
과ack
의 후손 도구들 간의 차이점과 공통점을 설명. -
ripgrep
은grep
의 대용량 파일 검색 능력과ack
의 "스마트" 검색 기본 설정을 결합함.
파일 검색 준비
- 빠른 디렉토리 반복자 사용과 파일 경로 필터링이 중요.
-
.gitignore
파일의 규칙을 빠르게 적용하는 것이 성능에 영향을 미침.
검색
- 빠른 정규 표현식 엔진과 리터럴 최적화가 중요함.
- 전체 파일이 아닌 라인별로 검색하지 않고 큰 버퍼를 한 번에 검색함.
출력
- 검색 결과를 메모리 버퍼에 쓰고, 이를
stdout
으로 직렬화하여 출력함.
방법론
개요
- 사용자가 해결하려는 문제에 초점을 맞추고, 공정한 벤치마크를 위해 노력함.
- 다양한 도구를 벤치마크하고, 각 도구의 기본 동작 차이를 고려하여 비교함.
GN⁺의 의견
이 글에서 가장 중요한 것은 ripgrep
이 기존의 검색 도구들과 비교하여 어떤 장점을 가지고 있는지를 상세히 설명하고 있다는 점입니다. 특히, 빠른 성능과 유니코드 지원, 다양한 파일 형식과 인코딩에 대한 지원 등이 사용자에게 매력적인 이유가 될 수 있습니다. 이 글이 흥미로운 이유는 새로운 도구가 기존 도구들과 어떻게 다른지, 그리고 그 차이가 실제 사용자에게 어떤 영향을 미칠 수 있는지를 이해하는 데 도움을 주기 때문입니다.
Hacker News 의견
- ripgrep과 fzf의 조합은 매우 빠르며, 이를 활용하는 Powershell 함수 예시가 제공됨. 이 함수는 ripgrep으로 검색한 후 fzf를 사용하여 퍼지 검색을 하고, bat를 통해 결과의 컨텍스트를 보여줌. 이 방법은 여러 저장소 프로젝트에서 특정 내용의 위치를 빠르게 찾는 데 유용함.
- Emacs의 project.el 패키지와 dumb-jump 패키지를 사용하여 ripgrep을 활용하는 방법이 소개됨. dumb-jump는 특정 프로젝트 디렉토리 내에서 현재 파일 유형에 대한 검색을 자동으로 제한하며, ag라는 또 다른 빠른 도구도 지원함.
- ripgrep이 Node.js 래퍼를 통해 VS Code 검색 기능을 제공한다는 사실이 흥미로움.
- ripgrep 사용자는 grep 대비 사용의 용이성과 속도 향상을 주된 이유로 꼽으며, 특히 gitignore 규칙을 자동으로 적용하는 기능을 유용하게 사용함.
- ripgrep, ag와 같은 병렬화된 grep 대체품들이 grep보다 훨씬 빠르기 때문에 속도 차이가 큰 기준이 되지 않으며, 다른 방식으로 평가해야 함을 언급함.
- ripgrep의 초기 발표가 2016년이었음을 지적하며, 제목에 연도 표시가 필요함을 제안함.
- qgrep은 인덱스를 사용하여 빠른 속도를 제공하지만, UTF8 멀티라인 매치가 필요할 때는 ripgrep이 느려질 수 있음을 언급함.
- Emacs 내에서 ripgrep을 사용하는 Consult 패키지를 통해 프로젝트 전체 편집을 수행하는 편리한 워크플로우를 공유함.
- ripgrep-all 버전은 PDF와 doc 파일과 같은 다른 문서 유형에서도 작동한다는 정보를 제공함.
- grep이 왜 대체되거나 개선되지 않는지에 대한 의문을 제기하며, 이 주제가 다소 오래되었다고 평가함.