ag의 사용성과 grep의 속도를 결합한 초고속 재귀 검색 도구입니다. 기본적으로 .gitignore 규칙을 준수합니다.
| 플랫폼 | 명령어 |
|---|
| macOS (Homebrew) | brew install ripgrep |
| Ubuntu/Debian | sudo apt install ripgrep |
| Arch Linux | sudo pacman -S ripgrep |
| Fedora | sudo dnf install ripgrep |
| Windows (Scoop) | scoop install ripgrep |
| Windows (Choco) | choco install ripgrep |
| Cargo (Rust) | cargo install ripgrep |
| 확인 | rg --version |
| 명령어 | 설명 |
|---|
rg "pattern" | 현재 디렉토리에서 재귀적으로 검색 |
rg "pattern" path/ | 특정 디렉토리에서 검색 |
rg "pattern" file.txt | 특정 파일에서 검색 |
rg -i "pattern" | 대소문자 무시 검색 |
rg -S "pattern" | 스마트 대소문자 (모두 소문자면 대소문자 무시) |
rg -w "word" | 전체 단어만 일치 |
rg -c "pattern" | 파일별 일치 횟수 |
rg -l "pattern" | 일치하는 파일 목록만 표시 |
rg --files-without-match "pattern" | 일치하지 않는 파일 목록 |
rg -n "pattern" | 줄 번호 표시 (기본값) |
rg -N "pattern" | 줄 번호 숨김 |
rg --column "pattern" | 일치 항목의 열 번호 표시 |
rg -F "literal.string" | 고정 문자열 검색 (정규식 없음) |
| 명령어 | 설명 |
|---|
rg "foo|bar" | foo 또는 bar 일치 |
rg "^import" | ”import”로 시작하는 줄 |
rg ";\s*$" | 세미콜론으로 끝나는 줄 |
rg "\d{3}-\d{4}" | 전화번호 패턴 일치 |
rg "\bfunction\b" | 단어 경계 일치 |
rg "fn\s+\w+" | 함수 정의 일치 |
rg -P "(?<=@)\w+" | PCRE2 후방탐색 (도메인 추출) |
rg -P "\b\w{20,}\b" | 20자 이상의 단어 |
rg -U "struct \{[\s\S]*?\}" | 여러 줄 일치 |
rg -e "pat1" -e "pat2" | 다중 패턴 (OR 로직) |
rg -f patterns.txt | 파일에서 패턴 읽기 |
| 명령어 | 설명 |
|---|
rg -A 3 "pattern" | 일치 후 3줄 표시 |
rg -B 2 "pattern" | 일치 전 2줄 표시 |
rg -C 5 "pattern" | 컨텍스트 5줄 표시 (전후) |
rg -o "pattern" | 일치한 텍스트만 출력 |
rg --json "pattern" | JSON 형식으로 출력 |
rg --vimgrep "pattern" | Vim 호환 형식으로 출력 |
rg --color never "pattern" | 색상 출력 비활성화 |
rg --color always "pattern" | less -R | 파이핑 시 색상 강제 적용 |
rg --heading "pattern" | 파일별로 결과 그룹화 (터미널 기본값) |
rg --no-heading "pattern" | 그룹화 없이 한 줄 결과 |
rg --trim "pattern" | 결과에서 공백 제거 |
rg -m 5 "pattern" | 파일당 일치 5개로 제한 |
rg --max-count 1 "pattern" | 파일당 첫 번째 일치만 |
rg --stats "pattern" | 검색 통계 표시 |
rg --passthru "pattern" | 모든 줄 표시, 일치 항목 강조 |
| 명령어 | 설명 |
|---|
rg -t py "pattern" | Python 파일만 검색 |
rg -t js -t ts "pattern" | JavaScript와 TypeScript 파일 검색 |
rg -T html "pattern" | HTML 파일 제외 |
rg -g "*.md" "pattern" | 글로브 필터 — 마크다운 파일만 |
rg -g "!*.min.js" "pattern" | 글로브 제외 — 압축된 JS 제외 |
rg -g "src/**/*.ts" "pattern" | 디렉토리 경로가 있는 글로브 |
rg -g "!test/" "pattern" | test 디렉토리 제외 |
rg --type-list | 알려진 모든 파일 유형 표시 |
rg --type-add 'web:*.{html,css,js}' | 사용자 정의 파일 유형 정의 |
| 명령어 | 설명 |
|---|
rg --hidden "pattern" | 숨김 파일/디렉토리 포함 |
rg --no-ignore "pattern" | .gitignore 규칙 무시 |
rg --no-ignore-vcs "pattern" | VCS 무시 파일만 건너뛰기 |
rg -u "pattern" | 제한 없음 (—no-ignore) |
rg -uu "pattern" | 더 많은 제한 해제 (—no-ignore —hidden) |
rg -uuu "pattern" | 최대 제한 해제 (+ 바이너리 파일) |
rg --max-depth 2 "pattern" | 디렉토리 깊이 제한 |
rg -L "pattern" | 심볼릭 링크 따르기 |
rg --max-filesize 1M "pattern" | 1MB 이상 파일 건너뛰기 |
rg --sort path "pattern" | 파일 경로별로 결과 정렬 |
rg --sortr modified "pattern" | 수정 시간별 정렬 (최신 순) |
rg --files | rg가 검색할 모든 파일 목록 |
rg --files -t rust | 모든 Rust 파일 목록 |
| 명령어 | 설명 |
|---|
rg "old" -r "new" | 치환 미리보기 (표준 출력만) |
rg "(\w+)@(\w+)" -r '$1 at $2' | 정규식 캡처 그룹 치환 |
rg "TODO" -r "DONE" --passthru | 치환된 전체 파일 표시 |
rg -l "oldFunc" | xargs sed -i 's/oldFunc/newFunc/g' | 파일에서 실제 치환 (sed 사용) |
| 파일/변수 | 설명 |
|---|
~/.ripgreprc | 기본 구성 파일 |
RIPGREP_CONFIG_PATH | 사용자 정의 구성 파일 경로 |
--no-config | 구성 파일 무시 |
--smart-case
--line-number
--heading
--max-columns=200
--max-columns-preview
--glob=!node_modules/
--glob=!.git/
--glob=!dist/
--glob=!vendor/
--colors=match:fg:yellow
--colors=match:style:bold
--colors=path:fg:green
# 컨텍스트와 함께 모든 TODO 표시
rg "TODO|FIXME|HACK|XXX" -t py -C 2
# 파일별 TODO 개수
rg -c "TODO" --sort path
# 변경 사항 미리보기
rg "oldFunction" -r "newFunction" -t js
# 변경 사항 적용 (sed로 파이핑)
rg -l "oldFunction" -t js | xargs sed -i 's/oldFunction/newFunction/g'
# 패턴을 포함하지 않는 파일 찾기
rg --files-without-match "Copyright" -t py
# 사용되지 않는 내보내기 찾기
rg "export " -t ts -l | while read f; do
rg -l "$(basename $f .ts)" -g "!$f" || echo "Unused: $f"
done
# 압축된 로그 검색
rg -z "ERROR" /var/log/*.gz
# 오류에서 타임스탬프 추출
rg -o "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.*ERROR.*" app.log
# 일별 오류 횟수
rg -o "^\d{4}-\d{2}-\d{2}" --no-filename error.log | sort | uniq -c
# fzf를 사용한 대화형 파일 선택
rg --files | fzf --preview 'rg --color=always "pattern" {}'
# 결과를 vim에 전달
rg --vimgrep "pattern" | vim -q /dev/stdin
# jq를 사용한 JSON 파이프라인
rg --json "pattern" | jq 'select(.type == "match") | .data.lines.text'
| 도구 | 속도 | .gitignore | Unicode | 정규식 |
|---|
| ripgrep | 가장 빠름 | ✅ 지원 | ✅ 완전 지원 | ✅ Rust regex + PCRE2 |
| grep -r | 느림 | ❌ 미지원 | ⚠️ 부분 지원 | ✅ POSIX/확장 |
| ag (Silver Searcher) | 빠름 | ✅ 지원 | ✅ 완전 지원 | ✅ PCRE |
| ack | 보통 | ❌ 미지원 | ✅ 완전 지원 | ✅ Perl |
- 가능하면 글로브 대신 파일 유형 필터 (
-t, -T) 사용 — 더 빠르고 모든 확장자를 포함
.ripgreprc를 생성하여 스마트 대소문자, 헤딩, 디렉토리 제외를 기본값으로 설정
- 프로젝트 루트에
.ignore 파일 사용 — git에 영향 없이 node_modules, dist, build 제외
- 리터럴 문자열에
-F 사용 권장 — 정규식 메타문자가 포함된 경우 이스케이핑 방지
--stats 사용 — 대규모 코드베이스에서 검색 성능 이해
fzf 또는 xargs와 결합 — 대화형 선택 및 일괄 작업
- 검색 전
--files 사용 — 실제 검색 전 어떤 파일이 검색되는지 확인
- 여러 줄 모드 (
-U) 는 신중히 사용 — 더 느리므로 가능하면 여러 검색 사용 권장
| 문제 | 해결 방법 |
|---|
| git 저장소에서 결과 누락 | 파일이 .gitignore에 있을 수 있음 — rg -u 또는 --no-ignore 사용 |
| 바이너리 파일 건너뜀 | rg -uuu 또는 --text로 바이너리 파일 포함 |
| 정규식이 일치하지 않음 | PCRE2 엔진에 -P 시도하거나 리터럴 문자열에 -F 사용 |
\b로 결과 없음 | 기본 엔진이 지원하지 않을 수 있음 — rg -P "\bword\b" 시도 |
| 파이프에서 색상 누락 | less나 다른 도구로 파이핑 시 --color always 사용 |
| 구성이 로드되지 않음 | RIPGREP_CONFIG_PATH 확인하거나 디버깅에 --no-config 사용 |
| 심볼릭 링크가 따라지지 않음 | -L 또는 --follow 플래그 추가 |
| 결과가 너무 많음 | -g '!pattern' 글로브 또는 -t type으로 범위 축소 |
| 검색이 너무 느림 | --max-filesize 사용, --max-depth로 깊이 줄이기, 또는 유형 필터링 |