ack-grep 을 대체할 수 있는 빠른 코드 검색 도구 ag(silver searcher)
더 나은 명령어인 ripgrep 을 사용하는 게 좋습니다.
ack 명령어는 grep 처럼 파일이나 디렉터리에서 원하는 문자열을 찾는 유틸리티인데 개발자에 특화된 도구입니다.
ag 는 ack 를 대체하는 명령어로 개발자 편의성과 속도에 주안을 두고 개발한 제품으로 자동으로 .gitignore 에 있는 파일 패턴들을 검색하지 않으며 다양한 최적화를 통해 정말 번개같은 검색 속도를 보여줍니다.
이렇게 검색 속도가 빠른 이유는 다음과 같습니다.
- posix thread 를 사용해서 병렬로 검색하므로 multi core 의 장점을 최대한 활용
- buffer 대신 memory mapped file(mmap) system call 사용
- 보이어 무어(Boyer-Moore) 문자열 검색 알고리즘 사용(링크)
- 정규식 검색시 PCRE JIT compiler 사용
- 동일한 정규식을 반복적으로 컴파일하지 않고 pcre_study() 사용
- ignore 파일을 fnmatch() 로 매번 검색하지 않고 array 로 로딩한 후에 binary search로 처리
ag 가 빠르지만 미리 index 를 만들어 놓고 사용하는 ctags 보다는 느립니다.
ag 보다는 rg(ripgrep) 을 추천합니다.
설치
전체 설치 방식은 ag 의 github 저장소(링크)를 참고하세요.
Ubuntu
sudo apt install silversearcher-ag
OSX
brew install the_silver_searcher
CentOS/Rocky Linux
sudo yum install the_silver_searcher
Windows
MS의 패키지 관리자인 winget 으로 설치하면 됩니다.
winget install "The Silver Searcher"
사용
ag 명령어 뒤에 검색할 문자열과 경로를 입력해 주면 됩니다. 다음은 src 밑에 있는 파일들에서 cache 라는 문자를 대소문자 구분없이 검색합니다.
ag cache src/
대소문자를 구분하려면 -s, --case-sensitive 옵션을 추가합니다.
ag -s cache src/
무시하려면 파일 패턴이 있다면 --ignore 뒤에 패턴을 적어주면 됩니다. 다음은 확장자가 .md 인 파일을 제외하고 검색합니다.
ag -s cache --ignore "*.md" src/
무시할 패턴이 여러 개라면 --ignore 를 여러 번 사용해서 기술해 주면 됩니다. 다음은 확장자가 .md 와 .yaml 인 파일을 제외하고 검색합니다.
ag -s cache --ignore "*.md" --ignore "*.yaml" src/