Grep

如何在 fgrep/Ag 中加快搜尋速度?

  • December 25, 2016

我正在考慮使搜尋更快和/或更好的方法,主要使用fgrepor agand在 處不區分大小寫地搜尋單詞$HOME並將匹配列表重定向到的程式碼vim

find -L $HOME -xtype f -name "*.tex" \
  -exec fgrep -l -i "and" {} + 2>/dev/null | vim -R -

ag由於並行性和ack

find -L $HOME -xtype f -name "*.tex" \
  -exec ag -l -i "and" {} + 2>/dev/null | vim -R -

統計數據

小組平均統計fgrep數據ag``time

       fgrep   ag     terdon1  terdon2  terdon3  muru 
user    0.41s   0.32s  0.14s    0.22s    0.18s    0.12s
sys     0.46s   0.44s  0.26s    0.28s    0.30s    0.32s

terdon1terdon3可以相等快。我對這兩個有很大的波動。一些按時間排名sys(不是最佳標準!)

  1. terdon1
  2. terdon2
  3. terdon3
  4. fgrep

縮寫

  • terdon1 = terdon-many-find-grep
  • terdon2 = terdon-many-find-fgrep
  • terdon3 = terdon-many-find-ag (沒有 F 因為不存在於 中ag

其他程式碼

muru 在評論中的提議

grep -RFli "and" "$HOME" --include="*.tex" | vim -R -

作業系統:Debian 8.5

硬體:華碩 Zenbook UX303UA

您可以通過find並行執行多個呼叫來加快速度。例如,首先獲取所有頂級目錄並執行 N 個查找呼叫,每個目錄一個。如果您在子shell 中執行,您可以收集輸出並將其傳遞給vim 或其他任何東西:

shopt -s dotglob ## So the glob also finds hidden dirs
( for dir in $HOME/*/; do 
   find -L "$dir" -xtype f -name "*.tex" -exec grep -Fli and {} + & 
 done
) | vim -R -

或者,為了確保您只有在所有查找完成後才開始獲取輸出:

( for dir in $HOME/*/; do 
   find -L "$dir" -xtype f -name "*.tex" -exec grep -Fli and {} + & 
 done; wait
) | vim -R -

我進行了一些測試,上面的速度確實比單一的要快一些find。平均而言,超過 10 次執行,單個find呼叫工具 0.898 秒,上面的子外殼執行每個目錄一個查找需要 0.628 秒。

我假設細節總是取決於你有多少目錄$HOME,其中有多少可以包含.tex文件以及有多少可以匹配,所以你的里程可能會有所不同。

由於您使用的是ackThe Silver Searcher ( ag),因此您似乎可以使用其他工具。

這個領域的一個新工具是 ripgrep ( rg)。它旨在快速查找要搜尋的文件(如ag)和快速搜尋文件本身(如普通的舊 GNU grep)。

對於您問題中的範例,您可能會像這樣使用它:

rg --files-with-matches --glob "*.tex" "and" "$HOME"

ripgrep 的作者發布了對不同搜尋工具如何工作的詳細分析以及基準比較。

其中一個基準測試linux-literal-casei與您描述的任務有些相似。它搜尋大量嵌套目錄(Linux 程式碼庫)中的大量文件,搜尋不區分大小寫的字元串文字。

在該基準測試中,rg使用白名單時速度最快(例如您的“*.tex”範例)。該ucg工具在此基準測試中也表現出色。

rg (ignore)         0.345 +/- 0.073 (lines: 370)
rg (ignore) (mmap)  1.612 +/- 0.011 (lines: 370)
ag (ignore) (mmap)  1.609 +/- 0.015 (lines: 370)
pt (ignore)        17.204 +/- 0.126 (lines: 370)
sift (ignore)       0.805 +/- 0.005 (lines: 370)
git grep (ignore)   0.343 +/- 0.007 (lines: 370)
rg (whitelist)      0.222 +/- 0.021 (lines: 370)+
ucg (whitelist)     0.217 +/- 0.006 (lines: 370)* 
    • 最佳平均時間。+ - 最佳採樣時間。

作者ack將基準排除在外,因為它比其他基準慢得多。

引用自:https://unix.stackexchange.com/questions/332543