特定の時間より大きい特定のログエントリをgrep

特定の時間より大きい特定のログエントリをgrep

特定のテキストを使用して、現在の日付より後の特定の時間のログをフィルタリングしたいと思います。現在の日付を含むテキストのログを正常にフィルタリングしました。これはコマンドです:

grep "$(date +"%d/%b/%Y")" test.log | grep -i "failed login"

サンプルログは次のとおりです。

[04/Dec/2019 02:05:13 -0800] access       WARNING  10.126.49.92 -anon- - "POST /hue/accounts/login HTTP/1.1"-- Failed login for user: testuser

[04/Dec/2019 02:05:15 -0800] access       WARNING  10.126.49.92 -anon- - "POST /hue/accounts/login HTTP/1.1"-- Failed login for user: testuser

[04/Dec/2019 02:04:59 -0800] access       INFO     10.126.49.92 ahmed.rao - "POST /notebook/api/check_status HTTP/1.1" returned in 759ms

[04/Dec/2019 02:05:00 -0800] base         INFO     Selected cluster 0e83a448-26c9-459b-a0f2-3478ecb119af {u'interface': u'impala', u'namespace': u'0e83a448-26c9-459b-a0f2-3478ecb119af', u'type': u'direct', u'id': u'0e83a448-26c9-459b-a0f2-3478ecb119af', u'name': u'0e83a448-26c9-459b-a0f2-3478ecb119af'} interface hiveserver2

[04/Dec/2019 03:05:00 -0800] access       INFO     10.126.49.92 ahmed.rao - "POST /notebook/api/close_statement HTTP/1.1" returned in 1345ms

[04/Dec/2019 03:05:00 -0800] base         INFO     Selected cluster 0e83a448-26c9-459b-a0f2-3478ecb119af {u'interface': u'impala', u'namespace': u'0e83a448-26c9-459b-a0f2-3478ecb119af', u'type': u'direct', u'id': u'0e83a448-26c9-459b-a0f2-3478ecb119af', u'name': u'0e83a448-26c9-459b-a0f2-3478ecb119af'} interface hiveserver2

[04/Dec/2019 03:05:18 -0800] access       WARNING  10.126.49.92 -anon- - "POST /hue/accounts/login HTTP/1.1"-- Failed login for user: testuser

しかし、特定の時間よりも大きな条件を適用する方法がわかりません。

ベストアンサー1

tsfromを使用すると、moreutilsこれらのタイムスタンプをより便利な形式に簡単に変換できます。

ts -r %FT%T%z < file.log |
  awk '$0 > "[2019-12-04T02:50" && tolower($0) ~ /failed login/'

あなたの入力(とタイムゾーンAmerica/Los_Angeles)を考えると、次のようになります。

[2019-12-04T03:05:18-0800] access       WARNING  10.126.49.92 -anon- - "POST /hue/accounts/login HTTP/1.1"-- Failed login for user: testuser

tsそのタイムスタンプを解析し、-r指定された%FT%T%z strftime形式(タイムゾーン)に変換します。

書式は語彙と時系列で等しくソートされるため、指定された日付より後の項目を見つけるYYYY-MM-DDTHH:MM:SSには文字列比較のみが必要です。それでも仕事をすることができます。ここでは、大文字と小文字を区別しない標準一致方法が使用されます。 GNUを使用すると、次のこともできます。awkawkgrep -itolower()awk

gawk -v IGNORECASE=1 '$0 > "[2019-12-04T02:50" && /failed login/'

ない場合は、'sを使用してmoreutils解析を実行できます('sを使用するPerlスクリプトですが、'sとは対照的にコアモジュールの1つではないため、システムにインストールされない可能性があります)。perlTime::PiecetsDate::ParseTime::Pieceperl

CUT=2019-12-04T02:50:00-0800 perl -MTime::Piece -F'[][]' -ale '
  BEGIN{$cut = Time::Piece->strptime($ENV{CUT}, "%FT%T%z")}
  print if /failed login/i &&
           Time::Piece->strptime($F[1], "%d/%b/%Y %T %z") >= $cut' < file.log

1 DSTを適用するタイムゾーンで冬/夏の時計の変更時間を無視する場合

おすすめ記事