본문 바로가기
Tools2026년 8월 15일5분 읽기

ripgrep(rg) — grep보다 빠른 코드 검색의 비결

YS
김영삼
조회 6
ripgrep(rg) — grep보다 빠른 코드 검색의 비결

ripgrep(명령어 rg)은 디렉터리를 재귀적으로 뒤져 정규식과 일치하는 줄을 찾아주는 검색 도구입니다. grep -r과 하는 일은 같은데, 기본값이 똑똑하고 훨씬 빠르다는 게 차이입니다. Rust로 짜였고, 요즘 에디터·IDE의 "전체 검색" 뒤에서 실제로 돌아가는 엔진이 대개 이 녀석입니다.

솔직히 나도 처음엔 "grep이면 충분하지"였습니다. 그런데 수십만 파일짜리 모노레포에서 grep -rnode_modules.git까지 싹 훑으며 몇십 초를 잡아먹는 걸 겪고 나서, 하루 만에 갈아탔습니다. 지금은 손가락이 grep 대신 rg를 먼저 칩니다.

왜 빠른가 — 단순히 "Rust라서"가 아니다

속도의 상당 부분은 언어가 아니라 안 뒤지는 것에서 나옵니다. ripgrep은 세 가지를 기본으로 합니다.

  • .gitignore 존중 — 무시 대상 파일을 아예 검색하지 않습니다. node_modules, 빌드 산출물, 로그가 자동으로 빠지니 검색 대상 자체가 확 줄어듭니다.
  • 바이너리 파일 건너뛰기 — 이미지·실행파일 같은 걸 알아서 제외합니다.
  • 병렬 처리 — 여러 파일을 여러 코어로 동시에 훑습니다.

여기에 정규식 엔진이 유한 오토마타 기반이라, 뒤에서 다룰 백트래킹 폭발(ReDoS) 걱정 없이 큰 입력에서도 선형에 가깝게 돕니다. 즉 빠름의 정체는 "적게 뒤지고, 나눠 뒤지고, 폭발하지 않는 엔진"의 합작입니다.

손에 붙는 기본 사용법

# 현재 폴더 아래 전부에서 검색 (재귀가 기본)
rg "createUser"
# 특정 확장자만
rg "TODO" -t js          # JS만
rg "config" -g '*.yaml'  # glob으로
# 대소문자 스마트: 소문자로 치면 무시, 대문자 섞으면 구분
rg -S "Parser"
# 매치된 파일 이름만
rg -l "deprecated"
# 앞뒤 3줄 맥락까지
rg -C 3 "panic"
# 무시 규칙까지 다 무시하고 진짜 전부
rg -uu "secret"

특히 -t(파일 타입)와 -g(glob)를 익혀두면 검색 범위를 좁히는 데 큰 힘이 됩니다. rg --type-list로 어떤 타입 이름이 있는지 볼 수 있어요.

grep과 미묘하게 다른 점들

대체로 호환되지만, 갈아탈 때 몇 가지가 헷갈립니다. 정리해 두면 삽질을 줄입니다.

항목grepripgrep(rg)
재귀-r 필요기본값
정규식 문법BRE/ERE(기본 BRE)Rust regex(PCRE 유사)
.gitignore무시 안 함존중(기본)
역참조/룩어라운드PCRE에서만-P로 PCRE2 활성화

주의할 점 하나. 기본 rg 엔진은 역참조와 룩어라운드를 지원하지 않습니다. 선형 시간을 보장하려고 일부러 뺀 겁니다. 그런 고급 패턴이 필요하면 rg -P로 PCRE2 엔진을 켜야 하는데, 그 순간 속도·안전성 이점의 일부를 내주는 셈이라 꼭 필요할 때만 씁니다.

실전에서 자주 쓰는 조합

내가 제일 자주 치는 건 rg -n "패턴" | fzf입니다. 매치 결과를 대화형으로 좁혀 원하는 줄로 바로 점프하죠. 여기에 에디터 연동까지 붙이면 "검색 → 파일 열기"가 한 흐름이 됩니다.

파일 이름 검색은 ripgrep의 형제격인 fd가 담당합니다. rg는 내용, fd는 이름 — 이 둘을 짝으로 익히면 find + grep 조합보다 훨씬 손이 가볍습니다.

또 하나 요긴한 게 치환 미리보기입니다. rg '패턴' -r '치환' 은 파일을 건드리지 않고 바뀔 결과만 화면에 보여줍니다. 대규모 리네이밍 전에 이걸로 영향 범위를 눈으로 확인한 뒤, 실제 수정은 sed나 에디터의 전역 치환으로 실행하면 사고를 크게 줄일 수 있습니다. 나는 대량 치환을 할 때 항상 이 "먼저 보기 → 그다음 바꾸기" 순서를 지킵니다.

자주 묻는 질문

ripgrep이 파일을 못 찾아요. 분명히 있는데요.

거의 확실히 .gitignore(또는 .ignore)에 걸려 제외된 겁니다. 로그나 빌드 산출물을 검색할 때 흔히 겪습니다. rg -u(무시 규칙 완화), rg -uu(숨김 파일까지), rg -uuu(바이너리까지)로 단계별로 풀 수 있습니다.

기존 grep 스크립트를 그대로 rg로 바꿔도 되나요?

정규식이 단순하면 대체로 됩니다. 다만 BRE 특유의 이스케이프(\(, \{)가 rg에선 다르게 동작하고, -r 없이도 재귀한다는 점 때문에 검색 범위가 넓어질 수 있습니다. 자동화 스크립트는 바꾼 뒤 결과 건수를 한 번 비교해 보는 걸 권합니다.

대소문자 옵션이 헷갈립니다.

-i는 항상 무시, -s는 항상 구분, -S(smart-case)는 "검색어가 전부 소문자면 무시, 대문자가 섞이면 구분"입니다. 나는 -S를 기본으로 두고 씁니다. 사람이 검색할 때의 직관과 잘 맞거든요.

ripgrep은 어떻게 설치하나요?

macOS는 brew install ripgrep, 데비안·우분투는 apt install ripgrep, 다른 배포판도 대부분 패키지가 있습니다. 설치되는 실행 파일 이름은 패키지명(ripgrep)과 달리 rg라는 점만 기억하면 됩니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록