特定のテキストを使用して、現在の日付より後の特定の時間のログをフィルタリングしたいと思います。現在の日付を含むテキストのログを正常にフィルタリングしました。これはコマンドです:
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
ts
fromを使用すると、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を使用すると、次のこともできます。awk
awk
grep -i
tolower()
awk
gawk -v IGNORECASE=1 '$0 > "[2019-12-04T02:50" && /failed login/'
ない場合は、'sを使用してmoreutils
解析を実行できます('sを使用するPerlスクリプトですが、'sとは対照的にコアモジュールの1つではないため、システムにインストールされない可能性があります)。perl
Time::Piece
ts
Date::Parse
Time::Piece
perl
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を適用するタイムゾーンで冬/夏の時計の変更時間を無視する場合