web-dev-qa-db-ja.com

巨大なログファイル(> 14 GB)のGrepは最後のx GBだけですか?

巨大なログファイル(14 GB以上)で何かを検索する必要があります。私はそれが最後の4GBかそこらにあるとかなり確信しています。

最初のX GBをスキップしてスピードアップする方法はありますか?

34
Roger

tail を使用して、-cスイッチを使用することで、最後の4 GBのみを出力できると思います

-c、-bytes = [+] NUM
最後のNUMバイトを出力します;または-c + NUMを使用して、各ファイルのバイトNUMから出力します

開始するオフセットにbs=1およびskipingを設定することにより、おそらく dd でも何かを実行できます。

dd if=file bs=1024k skip=12g | grep something
75
user9517

コメントの一部がそれを求めたので、私はこれを投稿しています

私が最終的に使用したのは(15 GBファイル)でした。これは非常に高速に動作し、時間を大幅に節約できました。

tail -f -c 14G file | grep something

また、同じファイルで非常に初歩的なベンチマークを行いました。私がテストした:

grep xxxファイル
//ずっとかかった(> 5分)

dd if = file bs = 1 skip = 14G | grep xxx
// 1秒未満の非常に速い

テール-c 14g | grep xxx
//かなり高速<2秒

tailは少し短いだけです。

NB:使用されるサフィックスgGはコマンドごとに異なります(Ubuntu 15.10)

32
Roger

これはタイトルの質問には答えませんが、やりたいことを実行します。 tacを使用してファイルを元に戻し、次にgrepを使用して文字列を検索します。文字列がファイル内で1回または既知の回数だけ出現する場合は、既知の出現回数が見つかるまで実行します。そうすれば、ファイルのどこにあるかについての想定が正しくない場合でも、ファイルが見つかります。制限したい場合は、headを使用して制限できます。 headコマンドはtacとgrepの間を行き来します。

したがって、コマンドは次のようになります。

tac < logfile | grep myString
19
Itsme2003