13

UNIXのファイルで文字列パターンを見つけたい。以下のコマンドを使用します。

$grep 2005057488 filename

しかし、ファイルには数百万行が含まれており、そのようなファイルがたくさんあります。grep 以外でパターンを取得する最速の方法は何ですか。

4

3 に答える 3

18

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
于 2012-11-29T12:38:59.390 に答える
2

grep は sed よりも高速に動作します。

$grep 2005057488 filename
$sed -n '/2005057488/p' filename

まだ両方ともファイル内の特定の文字列を取得するために機能します

于 2014-02-21T05:58:47.913 に答える
0
sed -n '/2005057488/p' filename

ただし、これがgrepよりも速いかどうかはわかりません。

于 2012-11-29T09:58:26.620 に答える