2012-11-29 11 views
11

UNIXでファイル内の文字列パターンを探したい。私は以下のコマンドを使用します:UNIXでファイル内の文字列を見つけるための速い方法

$grep 2005057488 filename 

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

答えて

0
sed -n '/2005057488/p' filename 

grepよりも高速かどうかはわかりません。

+0

でその特定の文字列を取得するために動作します。 'grep'はちょうど1つのことをするように設計されています(私の答えを見てください) – Steve

+0

@steve、私は私の答えを削除すべきですか? SOの新しい。助けてください。 – Anon

16

grepは一般的にはそれほど速いです。それは1つのものと1つのものにしか設計されておらず、それは非常にうまくいっています。あなたはなぜhereを読むことができます。

しかし、物事をスピードアップするために、試してみることができるいくつかのことがあります。まず、探しているパターンが固定文字列であるように見えます。幸い、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.) 

grepUTF-8上で、一般的にはかなり遅いので、あなたは環境LANG=Cを設定することで、各国語サポート(NLS)を無効にしてみてください可能性があります。そのため、あなたはこの調合を試みることができる:

LANG=C grep -F "2005057488" file 

は第三に、それはあなたの質問に明確ではありませんでしたが、あなたが唯一の何かがあなたのファイルに一度存在するかどうか検索しようとした場合、あなたはまたの最大数を追加してみてください可能性がありパターンを見つける時間。したがって、-m 1の場合、grepは、最初の発生が検出された直後に終了します。あなたのコマンドは次のようになります。あなたはマルチコアのCPUを持っている場合

LANG=C grep -m 1 -F "2005057488" file 

最後に、あなたがGNU parallel行くを与えることができます。それにはexplanation of how to use it with grepも付属しています。コアあたり1.5ジョブを実行し、grep 1000個の引数を与えるために:並列使用--pipe

find . -type f | parallel -k -j150% -n 1000 -m grep -H -n STRING {} 

grepへの大きなファイル:

< bigfile parallel --pipe grep STRING 

あなたのディスクとCPUに依存して、より大きな読むために速いかもしれブロック:

< bigfile parallel --pipe --block 10M grep STRING 
+0

+1のGNU並列 – Anon

+0

+1素晴らしい答え。 –

+1

非常に明確で正確な答え!ありがとう=) – digvijay91

2

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

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

まだどちらも、それはそうだファイル

関連する問題