UNIXのファイルで文字列パターンを見つけたい。以下のコマンドを使用します。
$grep 2005057488 filename
しかし、ファイルには数百万行が含まれており、そのようなファイルがたくさんあります。grep 以外でパターンを取得する最速の方法は何ですか。
UNIXのファイルで文字列パターンを見つけたい。以下のコマンドを使用します。
$grep 2005057488 filename
しかし、ファイルには数百万行が含まれており、そのようなファイルがたくさんあります。grep 以外でパターンを取得する最速の方法は何ですか。
grep
一般的には可能な限り高速です。1 つのことだけを目的として設計されており、非常にうまく機能します。ここで理由を読むことができます。
ただし、処理を高速化するために、いくつか試してみることができます。まず、探しているパターンは固定文字列のようです。幸いなことにgrep
、「固定文字列」オプションがあります。
-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched. (-F is specified by POSIX.)
第 2 に、grep
は一般に で非常に遅いためUTF-8
、環境を設定して各国語サポート (NLS) を無効にしてみてくださいLANG=C
。したがって、次の調合を試すことができます。
LANG=C grep -F "2005057488" file
第三に、あなたの質問では明確ではありませんでしたが、ファイルに何かが 1 回存在するかどうかだけを見つけようとしている場合は、パターンを見つけるために最大回数を追加することもできます。したがって、 when-m 1
は、grep
最初のオカレンスが見つかった直後に終了します。コマンドは次のようになります。
LANG=C grep -m 1 -F "2005057488" file
最後に、マルチコア CPU を使用している場合は、GNU 並列を試すことができます。grep での使用方法の説明も付いています。コアあたり 1.5 ジョブを実行し、1000 個の引数を に与えるにはgrep
:
find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {}
grep
大きなファイルを並行して使用するには--pipe
:
< bigfile parallel --pipe grep STRING
ディスクと CPU によっては、より大きなブロックを読み取る方が高速な場合があります。
< bigfile parallel --pipe --block 10M grep STRING
grep は sed よりも高速に動作します。
$grep 2005057488 filename
$sed -n '/2005057488/p' filename
まだ両方ともファイル内の特定の文字列を取得するために機能します
sed -n '/2005057488/p' filename
ただし、これがgrepよりも速いかどうかはわかりません。