GNU/Linux >> Linux の 問題 >  >> Linux

巨大なログ ファイル (>14 GB) で最後の x GB のみを grep しますか?

解決策 1:

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

<ブロック引用>

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

bs=1 を設定することで、おそらく dd でも何かを行うことができます そして skip 開始したいオフセットに移動します。例:

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

解決策 2:

一部のコメントでリクエストがあったため、これを投稿しています。

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

tail -f -c 14G file | grep something

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

<ブロック引用>

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

dd if=ファイル bs=1 skip=14G | grep xxx
// 非常に高速 <1 秒

テール-c 14g | grep xxx
// 非常に高速 <2 秒

tail

注意: g を使用した接尾辞 および G コマンドごとに異なる (Ubuntu 15.10)

解決策 3:

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

コマンドは次のようになります:

tac < logfile | grep myString

Linux
  1. カンマ区切りファイルでのみ引用符間のカンマを削除しますか?

  2. Grep一致後のファイルの行数をカウントする方法は?

  3. Grepのみを使用して最初のオカレンスのみを検索しますか?

  1. sed を使用してファイルの最後の n 行を削除する方法

  2. ファイルの行数だけを取得する方法

  3. ファイル内で \n を grep する方法

  1. ファイル内の単語をGrepしてから、ファイルをコピーしますか?

  2. Stdoutに出力し、同時にGrepをファイルに出力しますか?

  3. エラーのみを表示するためにDmesgログをフィルタリングする方法は?