還在使用 grep?試試專門為開發者設計的 Command Line 搜尋工具 - ripgrep

還在使用 grep?試試專門為開發者設計的 Command Line 搜尋工具 - ripgrep

ripgrep(rg) 是一個使用 Rust 程式語言編寫的 Command line 搜尋工具,作者解釋 rip 的意思不是超越、摧毀 grep, 而是 “rips through your code very quickly”.

它的特點是結合:

  • Ag(The Silver Searcher)Pthreads 搜尋特點 - 利用多個 CPU 搜尋檔案
  • GNU grep 的 Boyer-Moore 演算法,透過 「減法搜索」 從要搜尋的最後一個字開始查找,發現不匹配的字元數量後,直接跳過它們並繼續查找,在處理中、長文字搜尋有很好的效能。

除了 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

如何安裝 ripgrep

基本上在 Windows, MacOS 以及 Linux 作業系統上使用 ripgrep 的方式都差不多,因為它是一個跨平台的工具

$ brew install ripgrep

上述是 MacOS 作業系統透過 Homebrew 的安裝方式,若是使用其他的作業系統可以參考 官方的安裝指南

ripgrep 真正竄紅的原因

這幾個功能讓它在眾多 Command Line Tool 脫穎而出:

  1. 遞迴搜尋模式(Recursive search)

  2. 輸出內容用顏色標示(Color highlighting)

  3. 除了 UTF-8 以外,更支援其他編文件,像是 UTF-16(自動偵測)、latin-1、GBK、EUC-JP、Shift_JIS

  4. 可以搜尋 zip 壓縮檔案(gzip、xz、lzma、bzip2 或 lz4 都可以)

  5. 預設自動忽略 .gitignore 隱藏檔案

  6. ripgrep 不會去修改文件(有人用 Vim 來查看而誤按?

gitignore 忽略敏感資訊

它可以遵照你在 .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),就是告訴它我同時要找關鍵字前 / 後幾行的內容。

ripgrep 開發過程的插曲

現代的知識份子都有文人相輕的習氣、彼此互相嫉妒,而這也發生在 rg 的開發歷程上。

Hacker News 上完整記載了 rg 和 ag(The Silver Searcher) 作者彼此的交流,一開始兩人都在互懟,但到後面態度開始放軟,彼此給予建議合力建造開發者社群最需要的工具,從競爭到合作絕對是開發社群要學習的態度之一。

上述就是我最常使用的搜尋方式,若想要學習更多搜尋方式可以在 Terminal 透過 rg -hrg --help 看更多的介紹,趕快安裝試試看吧 💪🏾💪🏾

Ref

comments powered by Disqus