如何在 fgrep/Ag 中加快搜尋速度?
我正在考慮使搜尋更快和/或更好的方法,主要使用
fgrep
orag
。and
在 處不區分大小寫地搜尋單詞$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
例
terdon1
和terdon3
可以相等快。我對這兩個有很大的波動。一些按時間排名sys
(不是最佳標準!)
- terdon1
- terdon2
- terdon3
- 牆
- 在
- 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
文件以及有多少可以匹配,所以你的里程可能會有所不同。
由於您使用的是
ack
The Silver Searcher (ag
),因此您似乎可以使用其他工具。這個領域的一個新工具是 ripgrep (
rg
)。它旨在快速查找要搜尋的文件(如ag
)和快速搜尋文件本身(如普通的舊 GNUgrep
)。對於您問題中的範例,您可能會像這樣使用它:
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
將基準排除在外,因為它比其他基準慢得多。