過去5分間にファイルに記録されたログ行をどのように取得できますか?

過去5分間にファイルに記録されたログ行をどのように取得できますか?

次のログファイルがあり、継続的に記録されます。

2021-08-12 16:09:17 textsp sdgg
reponse:success
prams:invalid
2021-08-12 16:10:17 textdfdfdlfs sfdfs
reponse: failed
prams:valid

5分前のログを取得するスクリプトを作成したいと思います。しかし、まだ分からない。ラインには応答パラメータが含まれており、ベビーカーには時間がないため、フィルタリングが困難です。この事件についてどう思いますか?

ベストアンサー1

GNUを使用すると、dateawkのことができます。

START=$(date -d '5 minutes ago' +'%F %T') \
  LC_ALL=C awk '
    /^[0-9]{4}(-[0-9]{2}){2}/ && $0 >= ENVIRON["START"], 0
    ' < file.log

awk 'start, end {action}'開始範囲と終了範囲内の行で実行するためにジョブを使用しますが、ここではジョブは指定されず、デフォルトでは行0(意味)が印刷されます。間違った)を終了条件として使用し、タイムスタンプのように見え、5分前のタイムスタンプより大きいもので始まる最初の行で始まります。

2つのタイムスタンプ間のログの場合:

START=$(date -d '15 minutes ago' +'%F %T') \
  END=$(date -d  '5 minutes ago' +'%F %T') \
  LC_ALL=C awk '
    match($0, /^[0-9]{4}(-[0-9]{2}){2} ([0-9]{2}:){2}[0-9]{2}/) {
      timestamp = substr($0, RSTART, RLENGTH)
      if (timestamp > ENVIRON["END"]) exit
      if (timestamp >= ENVIRON["START"])
        started = 1
    }
    started' < file.log

これは、ログエントリが時系列でソートされていると仮定します。いつもそうではありません。たとえば、タイムスタンプはジョブの開始を示しますが、ログエントリはジョブの最後に追加され、一部のサーバーソフトウェアは複数のジョブを同時に実行します。

おすすめ記事