過去 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
説明する:
fma=...
5分前のシェル変数に年、月、日、時、分、秒形式で保存されているというのですが、fma
これがdate
ログで行う作業のようです。line_num=...
ファイルを逆さまに読み、にパイプするとしましょう。プログラムawk
で bash 変数を as として保存し、フィールド数が 1 を超えてログ時間が目標時間より短い場合、これまでに見た行数を印刷します。 (見えない行を含む)t限定)終了します。結果をシェル変数として保存します。awk
$fma
five_minutes_ago
line_num
- 最後に、次を使用して
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
これにより、タイムスタンプに関する問題が解決され、ログファイルを解析できました。