grepは2番目に高速です。

grepは2番目に高速です。

時間がかかる再帰検索を実行するとしますgrep。結果を見た後、別の出力が必要です。たとえば、-C 33つのコンテキスト行オプションを追加したいと思います。新しいオプションを追加して検索全体をやり直すことができます。以前のように待つ必要があります。

grep2番目の検索をすばやく実行するための賢明な方法はありますか?

答え1

grepファイルはオペレーティングシステムキャッシュに存在する必要があるため、2番目の時間はすでに高速である必要があります(I / Oバインディングの場合)。

状態はまったく保存されず、提供された入力パラメータでのみ機能するため、以前のgrep結果を独自に再利用する方法はありませんgrep

この問題が頻繁に発生する場合は、検索時間を短縮し、結果を改善するためにデスクトップ検索エンジンまたはテキストインデックスを調べることをお勧めします。

答え2

ファイルがまだディスクキャッシュにある場合は、2番目の検索が高速になります。

検索を高速化するには、インデックスを作成する必要があります。これはgrepの作業範囲をはるかに超えています。これは検索ツールであり、インデックス作成ツールではありません。コマンドラインに優しいフルテキストインデックス付け?いくつかのインデックスツールがリストされています。

繰り返し検索を高速化するために、grepをいくつかの方法で使用できます。たとえば、最初に一致するファイルのリストを取得しますgrep -l。ファイル名にスペースまたはシェルワイルドカードが含まれていない場合は、*?\[ファイル名を変数に入力できます。

f=$(grep -l -r foo .)
grep foo $f
grep -C3 foo $f
grep foobar $f

答え3

一致するファイルのリストを保存し、一致するファイルに対してのみgrepを実行できます。はるかに速くなります。たとえば、find+を使用できますgrep

find . -type f -exec grep -l 'PATTERN' {} \+ | xargs grep -H -C 3 'PATTERN'

grep最初の実行後に出力を確認する必要がある場合は、少し難しいですが、findそれでも簡単です。あなたは次のようなものを使用する必要があります

find -exec grep -H 'PATTERN' {} \+ | tee -a out.log |\
sed 's/^[^:]*://' | sort -u | xargs grep -C 3  'PATTERN'

出力は out.log ファイルに保存されます。

答え4

  1. 本当に必要ですかgrep?正規表現を使用しますか?fgrep はい急いで。
  2. マニュアルページによると、GNUは次のようにgrep述べています。 「...場合によっては、--mmapはより良いパフォーマンスを提供します...」(しかし、いくつかの問題があります。マニュアルページを参照)。--mmap
  3. ファイルを保存するだけです。一致する行の行番号を入力してから繰り返さないでくださいgrep。二度とやり直す必要はありません。そうですか?

関連情報