行が書き込まれた時間に基づいてファイルのスライスを切り取る

行が書き込まれた時間に基づいてファイルのスライスを切り取る

ログ ファイルが最大 5 GB に達する可能性のあるプロセスを常に実行しています。時間間隔に基づいてこのログのスライスを取得する必要がある場合があります (通常は dd を使用します)。時間間隔に基づいてログのスライスを取得する Linux コマンドはありますか?

PS: このログ内のほとんどの行にはタイムスタンプがありません。

答え1

それを可能にするコマンドがない場合 (Wiese が提案したように)、ファイルの外部インデックスを作成してみませんか?

単なるアイデアですが、永久に実行されるスクリプト(またはほぼ永久に実行されるスクリプトについては、以下の注記を参照)を作成し、インデックスを作成するための時間間隔を指定できます。

PIDofThisInstance=$$
# ... you code for the header, checks... 
while true  ; do
  # This is the core of your cycle
    sync   # Maybe
    CurrentSize=`ls -s $MyFile  | awk '{print $1} ' `
    CurrentTime=`date +"%Y%m%d%H%M%S"`
    echo $CurrentTime $CurrentSize >> $Log_Of_My_Log_File
    sleep $TimeToSleep
  # if (exit-condition)
  # then
  #    break           #Exit from the infinite loop.
  # fi
done 

その後、開始/終了の日付/時刻を指定すると、開始/終了サイズが返される別のスクリプトを実行できます。その数値からファイルを切り取ることができます。

巨大なファイルだと言っていました。だから、行番号そして多分head MyFile.log -n xxx | tail -n yyy。長くなります。サイズに合わせて作業する方が良いでしょう。

ノート:

  • これがフォーマットされた出力のログである場合 (たとえあなたが知らない場合でも)、開発会社/プログラマーによる何らかの分析ツールが存在する可能性は常にあります。何年も経ってから出てくる可能性もあります。私見では、その形式には触れず、別のファイルを作成したほうがよいでしょう。
  • ログを生成するプログラムの PID がわかっている場合は、現在の PID (手動で強制終了する必要がある場合)、ファイル名 (ログのオブジェクト) などのスクリプト パラメータを記述します。
  • サイクルは永久に続く場合もあれば、ログを生成するプログラムの PID がもう存在しない、ファイルがもう存在しない、実際のサイズが古いものよりも小さい (ファイルを移動するかログを再起動すると、インデックス作成を再開する必要がある) などの条件がある場合に終了する場合もあります。
  • $LastSize をメモリに保持すると、必要のないときに「ログのログ」に行を印刷しないようにしたり、アクティビティがない状態で長時間経過した後に停止したりすることができます (または時間間隔を動的に変更します...)

関連情報