리눅스 rg
rg는 ripgrep의 실행 명령어로, 파일과 디렉터리에서 문자열이나 정규표현식 패턴을 빠르게 검색하는 명령어이다. Linux 환경에서는 grep, find, ack, ag와 함께 파일 내용 검색과 소스코드 검색에 자주 사용된다.
rg는 Rust로 작성된 빠른 검색 도구인 ripgrep의 명령어 이름이다. 현재 디렉터리 또는 지정한 경로 아래의 파일을 재귀적으로 검색하고, 검색 패턴과 일치하는 줄을 출력한다.
기본적으로 rg는 다음과 같은 특성을 가진다.
- 현재 디렉터리 이하를 재귀적으로 검색
- 정규표현식 검색 지원
- `.gitignore` 규칙 자동 반영
- 숨김 파일과 숨김 디렉터리 기본 제외
- 바이너리 파일 기본 제외
- 검색 결과에 파일명과 줄 번호 표시
- grep보다 코드 검색에 편리한 기본 동작 제공
현재 디렉터리 아래에서 특정 문자열을 검색한다.
rg 검색어
예:
rg password
특정 경로에서 검색할 수도 있다.
rg password /var/log
특정 파일에서만 검색하려면 파일명을 함께 지정한다.
rg password app.log
rg는 grep과 비슷하게 파일 내용에서 패턴을 찾는 명령어이지만, 기본 동작이 코드 검색과 프로젝트 검색에 더 적합하다.
| 구분 | grep | rg |
|---|---|---|
| 기본 검색 범위 | 지정 파일 중심 | 현재 디렉터리 재귀 검색 |
| 정규표현식 | 지원 | 지원 |
| .gitignore 반영 | 기본 반영 안 함 | 기본 반영 |
| 숨김 파일 검색 | 명령 방식에 따라 다름 | 기본 제외 |
| 바이너리 파일 | 옵션 필요 | 기본 제외 |
| 코드 검색 편의성 | 상대적으로 낮음 | 높음 |
rg에서 자주 사용되는 옵션은 다음과 같다.
- `-i`, `--ignore-case`
- 대소문자를 구분하지 않고 검색한다.
rg -i password
- `-S`, `--smart-case`
- 검색어에 대문자가 없으면 대소문자를 무시하고, 대문자가 포함되면 대소문자를 구분한다.
rg -S password
- `-w`, `--word-regexp`
- 단어 단위로 정확히 일치하는 결과만 검색한다.
rg -w user
- `-n`, `--line-number`
- 줄 번호를 출력한다.
- 일반적으로 rg는 기본적으로 줄 번호를 출력하지만, 명시적으로 사용할 수 있다.
rg -n error
- `-v`, `--invert-match`
- 검색 패턴과 일치하지 않는 줄을 출력한다.
rg -v DEBUG app.log
- `-c`, `--count`
- 파일별 일치 줄 수를 출력한다.
rg -c TODO
- `-l`, `--files-with-matches`
- 검색어가 포함된 파일명만 출력한다.
rg -l TODO
- `-L`, `--follow`
- 심볼릭 링크를 따라가며 검색한다.
rg -L config
- `--hidden`
- 숨김 파일과 숨김 디렉터리도 검색한다.
rg --hidden password
- `--no-ignore`
- `.gitignore`, `.ignore`, `.rgignore` 등의 무시 규칙을 적용하지 않고 검색한다.
rg --no-ignore password
- `-u`
- 일부 자동 필터링을 완화한다.
- 반복해서 사용하면 더 많은 필터링을 해제한다.
rg -u password rg -uu password rg -uuu password
- `-g`, `--glob`
- glob 패턴으로 검색 대상 파일을 제한하거나 제외한다.
rg error -g "*.log" rg error -g "!node_modules/**"
- `-t`, `--type`
- 특정 파일 유형만 검색한다.
rg main -t py rg main -t js
- `-T`, `--type-not`
- 특정 파일 유형을 제외하고 검색한다.
rg main -T js
- `-F`, `--fixed-strings`
- 패턴을 정규표현식이 아니라 일반 문자열로 해석한다.
rg -F "user.name"
- `-e`
- 검색 패턴을 명시한다.
- 하이픈으로 시작하는 패턴을 검색하거나 여러 패턴을 사용할 때 유용하다.
rg -e "-option"
- `-A`
- 일치한 줄 이후의 줄을 함께 출력한다.
rg error -A 3
- `-B`
- 일치한 줄 이전의 줄을 함께 출력한다.
rg error -B 3
- `-C`
- 일치한 줄 앞뒤 문맥을 함께 출력한다.
rg error -C 3
- `--files`
- 검색 가능한 파일 목록만 출력한다.
rg --files
- `--replace`
- 검색 결과에서 일치한 패턴을 지정한 문자열로 바꾸어 출력한다.
- 파일 자체를 수정하는 것은 아니다.
rg "foo" --replace "bar"
rg는 기본적으로 검색 대상에서 일부 파일과 디렉터리를 제외한다.
기본적으로 제외되는 대상은 다음과 같다.
- `.gitignore`에 의해 무시되는 파일
- `.ignore`에 의해 무시되는 파일
- `.rgignore`에 의해 무시되는 파일
- 숨김 파일과 숨김 디렉터리
- 바이너리 파일
이러한 자동 필터링 때문에 rg는 소스코드 프로젝트에서 불필요한 결과를 줄이고 빠르게 검색할 수 있다.
숨김 파일과 숨김 디렉터리를 포함하려면 `--hidden` 옵션을 사용한다.
rg --hidden password
다만 `.gitignore` 규칙은 여전히 적용될 수 있다. 숨김 파일도 포함하고 ignore 규칙까지 무시하려면 다음과 같이 사용할 수 있다.
rg --hidden --no-ignore password
rg는 기본적으로 `.gitignore`를 따른다.
이를 무시하려면 `--no-ignore` 옵션을 사용한다.
rg --no-ignore password
더 강하게 자동 필터링을 해제하려면 `-u` 옵션을 반복해서 사용할 수 있다.
rg -u password rg -uu password rg -uuu password
일반적으로 `rg -uuu`는 숨김 파일, ignore 규칙, 바이너리 제외 등 자동 필터링을 최대한 해제하여 grep -r에 가까운 동작을 하게 한다.
`-g` 옵션을 사용하면 검색할 파일을 glob 패턴으로 제한할 수 있다.
로그 파일만 검색:
rg error -g "*.log"
Python 파일만 검색:
rg "def main" -g "*.py"
특정 디렉터리 제외:
rg error -g "!node_modules/**"
여러 glob 조건을 함께 사용할 수도 있다.
rg error -g "*.log" -g "!old/**"
rg는 파일 유형(type)을 이용한 검색을 지원한다.
Python 파일만 검색:
rg import -t py
JavaScript 파일만 검색:
rg function -t js
Markdown 파일만 검색:
rg TODO -t md
특정 파일 유형을 제외하려면 `-T`를 사용한다.
rg TODO -T md
지원되는 파일 유형 목록은 다음 명령어로 확인할 수 있다.
rg --type-list
rg는 정규표현식 패턴을 이용한 검색을 지원한다.
숫자 검색:
rg "[0-9]+"
이메일 형태 검색:
rg "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+"
특수 문자를 정규표현식이 아니라 일반 문자열로 검색하려면 `-F` 옵션을 사용한다.
rg -F "user.name"
검색 결과 주변 줄을 함께 보고 싶을 때는 `-A`, `-B`, `-C` 옵션을 사용한다.
일치한 줄 이후 3줄 출력:
rg error -A 3
일치한 줄 이전 3줄 출력:
rg error -B 3
일치한 줄 앞뒤 3줄 출력:
rg error -C 3
검색어가 포함된 파일명만 알고 싶을 때는 `-l` 옵션을 사용한다.
rg -l TODO
검색어가 포함되지 않은 파일을 찾고 싶을 때는 `--files-without-match`를 사용할 수 있다.
rg --files-without-match TODO
검색어가 몇 번 나타나는지 확인하려면 `-c` 옵션을 사용한다.
rg -c error
전체 일치 개수를 합산해서 보고 싶으면 `--count-matches`를 사용할 수 있다.
rg --count-matches error
검색하지 않고 rg가 검색 대상으로 인식하는 파일 목록만 출력하려면 `--files`를 사용한다.
rg --files
특정 확장자의 파일 목록만 얻고 싶으면 glob과 함께 사용할 수 있다.
rg --files -g "*.py"
`--replace` 옵션은 검색 결과에서 일치한 내용을 다른 문자열로 바꾸어 출력한다.
rg "foo" --replace "bar"
주의할 점은 이 명령이 파일 내용을 직접 수정하지는 않는다는 것이다. 실제 파일 수정이 필요하면 별도의 도구와 함께 사용해야 한다.
Linux 배포판에서는 패키지 관리자를 통해 설치할 수 있다.
Debian 또는 Ubuntu 계열:
sudo apt install ripgrep
Fedora 계열:
sudo dnf install ripgrep
Arch Linux 계열:
sudo pacman -S ripgrep
설치 후 실행 명령어는 일반적으로 `ripgrep`이 아니라 `rg`이다.
rg TODO
rg -i "error"
rg "listen" /etc
rg "error" -g "*.log" /var/log
rg "function" -g "!node_modules/**"
rg "^def " -t py
rg --hidden "token"
rg --no-ignore "password"
grep으로 현재 디렉터리 아래를 재귀 검색하려면 보통 다음과 같이 사용한다.
grep -R "password" .
rg에서는 다음처럼 더 간단하게 사용할 수 있다.
rg "password"
rg는 기본적으로 현재 디렉터리를 재귀 검색하므로, 소스코드 프로젝트에서 빠르게 검색하기 좋다.
find는 파일 이름, 경로, 크기, 수정 시간 등 파일 자체의 속성을 기준으로 파일을 찾는 명령어이다.
rg는 파일 내용에서 문자열이나 패턴을 찾는 명령어이다.
| 구분 | find | rg |
|---|---|---|
| 주요 목적 | 파일 찾기 | 파일 내용 검색 |
| 기준 | 파일명, 경로, 크기, 시간, 권한 등 | 문자열, 정규표현식 |
| 예 | 이름이 `.log`인 파일 찾기 | 파일 안의 `error` 문자열 찾기 |
rg는 코드 검색 도구인 ack, ag와 비슷한 목적을 가진다.
| 도구 | 특징 |
|---|---|
| grep | 전통적인 문자열 검색 도구 |
| ack | 프로그래머 친화적인 코드 검색 도구 |
| ag | The Silver Searcher. 빠른 코드 검색 도구 |
| rg | ripgrep. 빠르고 ignore 규칙을 잘 반영하는 코드 검색 도구 |
rg를 사용할 때는 다음 사항에 주의한다.
- 기본적으로 `.gitignore` 규칙을 따른다.
- 숨김 파일은 기본 검색 대상에서 제외된다.
- 바이너리 파일은 기본적으로 검색하지 않는다.
- 검색 결과가 나오지 않을 때는 ignore 규칙이나 숨김 파일 여부를 확인해야 한다.
- 정규표현식 특수 문자를 일반 문자로 검색하려면 `-F`를 사용한다.
- 파일 자체를 수정하는 치환 도구가 아니라 검색 도구이다.
- 매우 큰 디렉터리를 검색할 때는 대상 경로와 glob 조건을 명확히 지정하는 것이 좋다.
rg는 전통적인 자격시험에서 핵심 명령어로 자주 출제되는 도구는 아니지만, Linux 실무와 개발 환경에서 grep 계열 검색 도구를 이해할 때 함께 알아두면 좋다.
학습할 때는 다음 관점이 중요하다.
- rg는 ripgrep의 실행 명령어이다.
- 파일 내용에서 문자열이나 정규표현식을 검색한다.
- 기본적으로 현재 디렉터리를 재귀 검색한다.
- `.gitignore` 규칙을 기본적으로 따른다.
- 숨김 파일과 바이너리 파일은 기본적으로 제외한다.
- `--hidden`, `--no-ignore`, `-u` 옵션으로 자동 필터링을 조정할 수 있다.
- `-g` 옵션으로 파일 패턴을 제한하거나 제외할 수 있다.
- `-t` 옵션으로 파일 유형을 지정할 수 있다.
- rg는 ripgrep의 명령어 이름이다.
- rg는 파일 내용에서 문자열이나 정규표현식 패턴을 검색한다.
- rg는 기본적으로 현재 디렉터리 이하를 재귀적으로 검색한다.
- rg는 기본적으로 `.gitignore` 규칙을 따른다.
- rg는 숨김 파일과 바이너리 파일을 기본적으로 제외한다.
- `-i` 옵션은 대소문자를 구분하지 않는 검색이다.
- `-w` 옵션은 단어 단위 검색이다.
- `-g` 옵션은 glob 패턴으로 검색 대상을 제한하거나 제외한다.
- `-t` 옵션은 파일 유형을 기준으로 검색한다.
- `--hidden` 옵션은 숨김 파일과 디렉터리를 포함한다.
- `--no-ignore` 옵션은 ignore 규칙을 무시한다.
- `-uuu`는 자동 필터링을 최대한 해제하여 검색한다.
- rg는 grep보다 프로젝트 전체 검색과 코드 검색에 편리한 기본값을 제공한다.
- BurntSushi, ripgrep README.
- BurntSushi, ripgrep User Guide.
- Linux manual pages, grep(1).
- GNU grep manual.
