ログファイルの最後の時刻のエントリのみを表示

ログファイルの最後の時刻のエントリのみを表示

次のエントリを含む巨大なログファイルaccess.logがあります。

192.11.111.111 - - [05/Mar/2021:00:00:02 +0100] "GET ..."
192.250.14.80 - - [05/Mar/2021:00:00:09 +0100] "GET ..."
12.249.66.42 - - [05/Mar/2021:00:00:13 +0100] "GET ..."

過去の時間だけを取得またはフィルタリングする方法は?

ベストアンサー1

#!/bin/bash

age() { python -c '
import sys
from datetime import datetime
print(int((datetime.now() - datetime.strptime(sys.argv[1], sys.argv[2])).seconds))
' "$@"
}

tac access.log | while IFS= read line; do
    date=$(cut -d' ' -f4 <<< "$line")
    age=$(age "$date" "[%d/%b/%Y:%H:%M:%S")
    [ $age -gt 3600 ] && break
    printf '%s\n' "$line"
done

説明する:

  • 私は日付文字列の年齢を取得する関数を作成するためにpython datetimeモジュールを使用しています。
  • 次に、ファイルの行を逆方向に繰り返します。tac log | while ...
  • 日付文字列を取得するために使用しますcut
    • -d' '区切り文字が空白以外のタブの場合は、削除する必要があります。
    • またはawk '{print $4}' <<< "$line"代わりに使用
    • またはread ip some thing date tz else <<< "$line")を使用してください。
  • 最初のステップで定義した関数を使用して年齢を取得します。
  • 秒> 3600(= 1時間)の場合はループを停止します(break)。
  • それ以外の場合は、その行を印刷します(または何でもします)。

いくつかの追加の注意:

  • タイムゾーン(+0100)を無視しているので、ここではログファイルと同じタイムゾーンにあるとします。異なる時間帯にログファイルがある場合は、この機能を改善できますageねえ日付をに読みますcut -d' ' -f4,5

  • 明らかに を使用して完全な操作を実行できますが、ファイル全体を読み込むことなく、pythonファイルを逆順に読み取ることができます。それほど簡単ではないようです。私はとても良いですtac

  • date年齢を計算するには、bcなどを使用できます(ここでやったように)、しかし、日付形式はデフォルトでサポートされていないので、これは痛いでしょう。子ども、datetime.strptimeぴったりです。

  • この機能の利点は、ageあらゆる種類の作業に再利用できることです。ちょうど同じことを呼んでstrptime読むことができます。ここに録音してください

    age "date_string" "format"
    

おすすめ記事