1

過去 24 時間以内のエントリのログ ファイルを grep しようとしています。次のコマンドを思いつきました。

grep "$(date +%F\ '%k')"\|"$(date +%F --date='yesterday')\ [$(date +%k)-23]" /path/to/log/file

grep で正規表現を使用できることは知っていますが、正規表現にはあまり詳しくありません。今日の何か、または昨日の現在の時間以降の何かを検索していることがわかります。これは機能していません。grep の正規表現でコマンドを変数として渡そうとしているためだと推測しています。また、次のことを思いついた awk で awk を使用することに反対しませんが、変数を適切にチェックしていません。

t=$(date +%F) | y=$(date +%F --date='yesterday') | hr=$(date +%k) | awk '{ if ($1=$t || $1=$y && $2>=$hr) { print $0 }}' /path/to/log/file

変数を設定するのではなく、systimeをawkで使用できると思いますが、systimeにはまったく精通していません。いずれかのコマンドでの提案は大歓迎です! ああ、これがログのフォーマットです:

2012-12-26 16:33:16 SMTP connection from [127.0.0.1]:46864 (TCP/IP connection count = 1)
2012-12-26 16:33:16 SMTP connection from (localhost) [127.0.0.1]:46864 closed by QUIT
2012-12-26 16:38:19 SMTP connection from [127.0.0.1]:48451 (TCP/IP connection count = 1)
2012-12-26 16:38:21 SMTP connection from [127.0.0.1]:48451 closed by QUIT
2012-12-26 16:38:21 SMTP connection from [127.0.0.1]:48860 (TCP/IP connection count = 1)
4

1 に答える 1

1

を使用する 1 つの方法を次に示しGNU awkます。次のように実行します。

awk -f script.awk file

の内容script.awk:

BEGIN {
    time = systime()
}

{ 
    spec = $1 " " $2
    gsub(/[-:]/, " ", spec)
}

time - mktime(spec) < 86400

または、ここにワンライナーがあります:

awk 'BEGIN { t = systime() } { s = $1 " " $2; gsub(/[-:]/, " ", s) } t - mktime(s) < 86400' file

また、シェル変数を渡す正しい方法は、フラグawkを使用することです。-v私がawk何を意味するかを示すために、コマンドにいくつかの調整を加えましたが、これを行うことはお勧めしません。

awk -v t="$(date +%F)" -v y="$(date +%F --date='yesterday')" -v hr="$(date +%k)" '$1==t || $1==y && $2>=hr' file

説明:

したがってawk、ファイルの処理を開始する前に、BEGINブロックが最初に処理されます。timeこのブロックでは、 /という変数を作成tし、関数を使用して設定しsystime()ます。systime()システムエポックからの秒数として現在の時刻を返すだけです。次に、ログ ファイルのすべての行に対して、/awkという別の変数が作成され、これが 1 つのスペースで区切られた 1 番目と 2 番目のフィールドに設定されます。さらに、機能が正しく機能するためには、 のような他の文字をスペースでグローバルに置換する必要があります。specs-:mktime()gsub(). 次に、ログ ファイルの datetime が過去 24 時間 (または正確に 86400 秒) 以内であるかどうかをテストするのは、ちょっとした数学です。テストが true の場合、行は印刷されます。少し余分に読むと役立つかもしれません。 Time FunctionsString Manipulation Functionsを参照してください。HTH。

于 2012-12-27T00:01:09.043 に答える