ripgrep(rg) 是一個使用 Rust 程式語言編寫的 Command line 搜尋工具,作者解釋 rip 的意思不是超越、摧毀 grep, 而是 “rips through your code very quickly”.
它的特點是結合:
除了 Smart & Fast 我找不到其他的形容詞,如果你還在使用 Ag 或 grep, 不妨嘗試 ripgrep 帶給你的飛速體驗 !!
Tool | Command | Line count | Time |
---|---|---|---|
ripgrep (Unicode) | rg -n -w '[A-Z]+_SUSPEND' |
452 | 0.136s |
git grep | git grep -P -n -w '[A-Z]+_SUSPEND' |
452 | 0.348s |
ugrep (Unicode) | ugrep -r --ignore-files --no-hidden -I -w '[A-Z]+_SUSPEND' |
452 | 0.506s |
The Silver Searcher | ag -w '[A-Z]+_SUSPEND' |
452 | 0.654s |
git grep | LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND' |
452 | 1.150s |
ack | ack -w '[A-Z]+_SUSPEND' |
452 | 4.054s |
git grep (Unicode) | LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND' |
452 | 4.205s |
雖說如此,但其實不太清楚這是在什麼環境下(Linux, Windows)測試出來的結果?但應該不會差太多?如果有人測試過請跟我分享一下 XD
基本上在 Windows, MacOS 以及 Linux 作業系統上使用 ripgrep 的方式都差不多,因為它是一個跨平台的工具。
$ brew install ripgrep
上述是 MacOS 作業系統透過 Homebrew 的安裝方式,若是使用其他的作業系統可以參考 官方的安裝指南。
這幾個功能讓它在眾多 Command Line Tool 脫穎而出:
遞迴搜尋模式(Recursive search)
輸出內容用顏色標示(Color highlighting)
除了 UTF-8 以外,更支援其他編文件,像是 UTF-16(自動偵測)、latin-1、GBK、EUC-JP、Shift_JIS
可以搜尋 zip
壓縮檔案(gzip、xz、lzma、bzip2 或 lz4 都可以)
預設自動忽略 .gitignore
隱藏檔案
ripgrep 不會去修改文件(有人用 Vim 來查看而誤按?
它可以遵照你在 .gitignore
的設定下,進行搜尋會自動忽略 binary(二進位檔案) 和你要查找的檔案,而且是在預設模式下就進行這樣的預設設定,真的非常的聰明!!
在軟體實務開發上,我們不想把 API key 這種敏感、資安的內容放到 Repo 上,也不會想讓它顯示在螢幕,所以 ripgrep 不會去搜尋你忽略的檔案。
ripgrep 的二進位名稱是 rg
, 所以我們在搜尋任何檔案都會以 rg 起頭。
如果你之前用過 grep 再使用 ripgrep 真的是無痛轉移!它很多 command 都跟 ripgrep 的原理類似。
ripgrep
指令為 rg
。
rg PATTERN
這個 PATTERN 就是關鍵字,PATTERN 可以帶入正規表達式,會去搜尋當前目錄所有檔案含有關鍵字內容的結果。
rg PATTERN PATH
這個 PATH 就是你指定的檔案(路徑),去搜尋特定檔案中含有關鍵字內容的結果。
rg OPTIONS PATTERN
結合 OPTIONS(參數),用特殊的形式去呈現搜尋結果,例如:-c / --count
是匹配行總數。
語法:
$ rg <pattern> [files/directories]
簡單來說就是這樣:
$ rg keyword
# output
$ rg ripgrepisdope
ripgrep_01.md # 哪個檔案
1221:ripgrepisdope # 第幾行
這是最常見的用法,在當前目前目錄下所有檔案內容中遞迴搜尋字串。
「keyword」可以輸入任何你要查找的關鍵字。因爲它會去搜尋所有文件,所以你不需要跟它說檔案名稱,進行搜尋如果匹配的話,它會跟你說在這個檔案的第幾行。今天忘記某個關鍵字是放在哪個筆記文件時非常有用啊!!
$ rg ripgrepisdope ripgrep_01.md
# output
1221:ripgrepisdope
使用第二個參數來搜尋特定檔案,這裡的意思就是你要在 ripgrep_01.md
這個 Markdown 檔案中查找 ripgrepisdope
這個關鍵字。
ripgrep 非常適合來搜尋 UTF-8 萬國碼(支援 Unicode),因為可以使用 Regular expression(正規表達式) 來進行進階搜尋,例如:'\w'
就會根據 Unicode 的定義匹配出所有字符。
不過根據我的經驗,除非是真的要在程式碼大海找正規表達式相關的程式碼,不然其實很少用到。
$ rg -c ripgrepisdope
# output
ripgrep_04.md:1
ripgrep_03.md:1
ripgrep_05.md:1
ripgrep_01.md:1
ripgrep_02.md:1
在參數上加上 -c
或 --count
就是報告匹配行總數(Report a count of total matched lines),意思就是所有檔案中有 ripgrepisdope 這個關鍵字的有哪幾個檔案,且行數有幾行。
有支援行數這參數真的很方便!ripgrep 雖然不能去修改文件,但今天你在開發過程中 Code 都跑不起來或是遇到一些 bug, 除了用 VS Code 去編輯外,如果透過關鍵字找到對應的檔案(例如設定檔),發現後直接在 Terminal 用 Command 開啟 Vim 直接去編輯就好了。
$ rg -A 2 ripgrepisdope # 關鍵字後 2 行的內容
# output
ripgrep_05.md
1221:ripgrepisdope
1222-
1223-dope
ripgrep_04.md
1221:ripgrepisdope
1222-
1223-
$ rg -B 5 ripgrepisdope # 關鍵字前 5 行的內容
# output
ripgrep_01.md
1216-
1217-ag
1218-
1219-grep ....
1220-
1221:ripgrepisdope
ripgrep_03.md
1216-
1217-
1218-
1219-
1220-
1221:ripgrepisdope
參數:
-A
或 --after-context
-B
或 --before-context
參數後面加上數值(例如上述的 2 和 5),就是告訴它我同時要找關鍵字前 / 後幾行的內容。
現代的知識份子都有文人相輕的習氣、彼此互相嫉妒,而這也發生在 rg 的開發歷程上。
在 Hacker News 上完整記載了 rg 和 ag(The Silver Searcher) 作者彼此的交流,一開始兩人都在互懟,但到後面態度開始放軟,彼此給予建議合力建造開發者社群最需要的工具,從競爭到合作絕對是開發社群要學習的態度之一。
上述就是我最常使用的搜尋方式,若想要學習更多搜尋方式可以在 Terminal 透過 rg -h
或rg --help
看更多的介紹,趕快安裝試試看吧 💪🏾💪🏾