閱讀原文:https://einverne.github.io/post/2019/09/ripgrep-recursively-searches-directories-using-regex-pattern.html
ripgrep(簡稱 rg),是一個用 Rust 實現的命令行搜索工具,可以通過正則來搜索當前的目錄。默認情況下 ripgrep 會遵循 .gitignore 的內容,並且自動跳過隱藏的文件目錄,以及二進制文件。 ripgrep 原生支持 Windows, MacOS, Linux。ripgrep 和其他流行的搜索工具非常相似,比如 The Silver Searcher, ack 和 grep。
rg 的優勢
目前 Linux 下可用的搜索工具非常多,GNU 中的 grep, ack-grep,The Silver Searcher 等等,而 rg 的優勢在於快。
ripgrep是真正的快,我在一個有 26G 代碼的目錄中查找一個方法也可以在幾乎秒級的速度找到,所以我經常用來搜索不確定調用關系,但代碼又分布在不同項目中時使用。ripgrep遵循.gitignore,在默認情況下會跳過二進制文件,隱藏的文件目錄,不會追蹤軟鏈接,更進一步加快了速度。ripgrep支持 Unicode,可以搜索壓縮文件,還可以自己選擇正則表達式匹配引擎,比如 PCRE2。
Installation
安裝的內容直接參考官方頁面 即可。
brew install ripgrep
Usage
來看看 rg 的通用格式
USAGE: rg [OPTIONS] PATTERN [PATH ...] rg [OPTIONS] [-e PATTERN ...] [PATH ...] rg [OPTIONS] [-f PATTERNFILE ...] [PATH ...] rg [OPTIONS] --files [PATH ...] rg [OPTIONS] --type-list command | rg [OPTIONS] PATTERN
最不用記憶的就是直接:
rg "keyword"
會顯示當前目錄下的搜索內容,會打印出文件名及關鍵字出現的行數。
和 grep 命令類似,也有三個打印出上下行的選項
-A NUM打印匹配行后面 after N 行-B NUM打印匹配行前面 before N 行-C NUM打印匹配行前后 N 行
用正則表達式搜索
使用 -e REGEX 來指定正則表達式
rg -e "*sql" -C2
搜索所有內容包括 gitignore 和隱藏文件
默認 rg 會忽略 .gitignore 和隱藏文件,可以使用 -uu 來查詢所有內容:
rg -uu "word" .
顯示匹配的次數
使用 -c 來顯示匹配的次數:
rg -c "word" .
結果會在文件名后面增加一個次數。
搜索指定的文件類型
可以使用 -t type 來指定文件類型:
rg -t markdown "mysql" .
查看支持的文件類型:
rg --type-list
看到這里,有些讀者可能要問假如我要在兩個文件類型中查找呢,這個時候 -t 參數就無法滿足了,需要引入新的 -g 參數,man rg 看一下 -g 就知道該選項后面跟着一個 GLOB,正則表達式,包括或者去除一些文件或者目錄。比如要在 md 文件或者 html 文件中查找 “mysql” 關鍵字:
rg -g "*.{md,html}" "mysql"
注意這里是花括號。
只打印包含匹配內容的文件名
使用 -l 來打印文件名
rg -l -w "word" .
相反的是如果要打印沒有匹配內容的文件名
rg --files-without-match -w "word" .
啟用大小寫敏感
使用 -s 選項來啟用大小寫敏感
rg -s "word" .
使用 -i 來關閉大小寫敏感。
顯示不包含關鍵字的行
使用選項 -v 來顯示不包含關鍵字的行
rg -v "word" .
搜索單詞
添加 -w 參數僅顯示該單詞的內容,該選項等同於在搜索 Pattern 前后加上 \b,這樣可以避免因為模糊搜索而導致的不精確。
rg -w "myword" .
比如搜索 abc,可能有些單詞包含 dabce ,那么也會被搜索出來,而加上 -w 就不會搜索出來了。
reference
有兩個方法查看 rg 使用
man rgtldr rg- https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md
