解決策 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