ripgrep(簡(jiǎn)稱 rg)是一個(gè)超級(jí)快速且功能強(qiáng)大的命令行工具,用來(lái)在文件中進(jìn)行文本搜索。它是用 Rust 編寫的,通常比其它類似的工具(比如 grep)要快,尤其是在處理大目錄或者大文件的時(shí)候。簡(jiǎn)單來(lái)說(shuō),ripgrep 就是 grep 的升級(jí)版,它考慮了你系統(tǒng)中的 .gitignore 文件,如果某些文件、擴(kuò)展名或目錄被忽略,它會(huì)自動(dòng)跳過(guò),從而提升搜索速度。
1. 安裝 ripgrep
雖然大部分 Linux 系統(tǒng)預(yù)裝了 grep,但是 ripgrep 默認(rèn)并沒(méi)有安裝。不過(guò)它可以通過(guò)包管理器很方便地安裝,幾乎支持所有主流的 Linux 發(fā)行版。
Debian/Ubuntu 系列:
sudo apt update
sudo apt install ripgrep
CentOS/RHEL 系列:
sudo yum install epel-release
sudo yum install ripgrep
Fedora:
sudo dnf install ripgrep
Arch Linux:
pacman -S ripgrep
Gentoo:
emerge sys-apps/ripgrep
openSUSE(15.1 及以上版本):
sudo zypper install ripgrep
Debian Buster 或更高版本,Ubuntu 18.10 及以上版本:
sudo apt install ripgrep
2. 如何使用 ripgrep
如果你對(duì) grep 已經(jīng)很熟悉了,那么使用 ripgrep 會(huì)很輕松。其實(shí)它的工作原理很簡(jiǎn)單,你只需要提供一個(gè)搜索模式和文件名,ripgrep 就會(huì)幫你找到匹配的內(nèi)容并顯示出來(lái)。與 grep 類似,ripgrep 也支持在文件夾中遞歸搜索,并且會(huì)顯示文件內(nèi)容和匹配行的位置。
比如,如果你想在 Cargo.toml 文件中搜索 description,你可以這么做:
$ rg description Cargo.toml
這時(shí) ripgrep 會(huì)返回匹配到的行,顯示文件名和行號(hào)。
3. 高級(jí)功能
上下文搜索有時(shí)候你可能想查看匹配的文本前后的上下文行,特別是在查看代碼時(shí)。你可以使用 -C(或 --context)來(lái)指定顯示匹配行前后多少行。例如,顯示匹配前后 3 行:
$ rg -C 3 "description"
如果你只關(guān)心匹配行之后的內(nèi)容,可以使用 -A,如果只關(guān)心之前的內(nèi)容,可以用 -B。例如:
$ rg -A 3 "description" # 匹配后 3 行
$ rg -B 3 "description" # 匹配前 3 行
列出匹配行的列號(hào)如果你是 vim 用戶,或者需要精確到某行某列,可以用 --column 標(biāo)志來(lái)顯示列號(hào):
$ rg --column "description"
正則表達(dá)式搜索ripgrep 支持正則表達(dá)式,就像 grep 一樣。如果你想搜索某個(gè)模式,比如以 def 開(kāi)頭的行,你可以這么做:
$ rg "^def"
多線程搜索如果你的代碼庫(kù)很大,ripgrep 還支持多線程搜索,可以提高效率。例如,指定 4 個(gè)線程進(jìn)行搜索:
$ rg -j 4 "TODO"
排除某些文件如果你想排除某些文件或者目錄,可以使用 --glob 參數(shù)。比如,排除 node_modules 目錄:
$ rg "search_term" --glob '!node_modules/*'
忽略大小寫如果你希望搜索不區(qū)分大小寫,可以加上 -i 參數(shù):
$ rg -i "example"
搜索壓縮文件ripgrep 還可以搜索壓縮文件(如 .zip 文件),你只需要加上 -z 參數(shù):
$ rg -z "pattern" archive.zip