特定のタイムスタンプを持つログファイルの最後のX分を取得します。

特定のタイムスタンプを持つログファイルの最後のX分を取得します。

過去 5 分間、IPA ホストのログファイルに移動し、新しいユーザーの作成や DNS の変更などのアップデートを取得しようとしています。これを定期的に実行して、5分ごとに前の5分を確認し、いくつかの文字列を確認して一致させ、その結果を電子メールで送信したいと思います。ログに表示される型の文字列を簡単に比較する方法がわかりません。

20200114184803 = 2020-01-14 18:48:03

time: 20200114184803
Stuff
Stuff
Stuff

time: 20200114184804
Stuff
Stuff
Stuff

time: 20200114184811
Stuff
Stuff
Stuff

答え1

私はそれをいくつかの変数に分割しましたが、次の手順を実行するかパイピングすることでよりうまく処理できます。

fma=`date --date='5 minutes ago' +"%Y%m%d%H%M%S"`
line_num=`tac file.txt | awk -v five_min_ago=$fma\
      '(NF > 1 &&  $2 < five_min_ago ){print NR; exit 1}'`
tail -$line_num file.txt

説明する:

  1. fma=...5分前のシェル変数に年、月、日、時、分、秒形式で保存されているというのですが、fmaこれがdateログで行う作業のようです。
  2. line_num=...ファイルを逆さまに読み、にパイプするとしましょう。プログラムawkで bash 変数を as として保存し、フィールド数が 1 を超えてログ時間が目標時間より短い場合、これまでに見た行数を印刷します。 (見えない行を含む)t限定)終了します。結果をシェル変数として保存します。awk$fmafive_minutes_agoline_num
  3. 最後に、次を使用してtail最後line_numの行を取得します。file.txt

注:「もの」以上の情報がある可能性があるため、フィールドの確認回数を調整する必要がありますが、これによりほとんどの結果が得られます。

答え2

awk私のスクリプトでこの問題を解決しました。

ONE_HOUR_AGO="$(date -d '1 hour ago' +%Y%m%d%H)"
NOW="$(date +%Y%m%d%H)"
awk '/time: '$NOW'/,/time: '$ONE_HOUR_AGO'/' log_file.txt

これにより、タイムスタンプに関する問題が解決され、ログファイルを解析できました。

関連情報