還在使用 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 帶給你的飛速體驗 !!

​

目錄

  1. 和其他工具的搜尋速度比較

  2. 如何安裝 ripgrep

  3. ripgrep 真正竄紅的原因

  4. gitignore 忽略敏感資訊

  5. 常用的搜尋方式

  6. ripgrep 開發過程的插曲

    ​

和其他工具的搜尋速度比較

ToolCommandLine countTime
ripgrep (Unicode)rg -n -w '[A-Z]+_SUSPEND'4520.136s
git grepgit grep -P -n -w '[A-Z]+_SUSPEND'4520.348s
ugrep (Unicode)ugrep -r --ignore-files --no-hidden -I -w '[A-Z]+_SUSPEND'4520.506s
The Silver Searcherag -w '[A-Z]+_SUSPEND'4520.654s
git grepLC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND'4521.150s
ackack -w '[A-Z]+_SUSPEND'4524.054s
git grep (Unicode)LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND'4524.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 -h 或 rg --help 看更多的介紹,趕快安裝試試看吧 💪🏾💪🏾

​

Ref

comments powered by Disqus