awkは、レポート内のミリ秒単位の時間差を使用します。

awkは、レポート内のミリ秒単位の時間差を使用します。

以下のログファイルを解析する必要があります。

09/03/2020 00:05:03.364 Aggregated 1000 NMEs at a rate of 0 NMEs/sec
09/03/2020 00:05:03.366 Scheme S20_SessionClassAggregation tree contained 1000 nmes, 500 flushed, 0 remain.
09/03/2020 00:05:03.582 Flushed 1000 NMEs at a rate of 0 NMEs/sec
09/03/2020 00:20:03.598 Aggregated 2000 NMEs at a rate of 0 NMEs/sec
09/03/2020 00:20:03.602 Scheme S20_SessionClassAggregation tree contained 2000 nmes, 1000 flushed, 0 remain.
09/03/2020 00:20:03.860 Flushed 2000 NMEs at a rate of 0 NMEs/sec

009/03/2020 00:05:03.582レポートの最後に、3行()から1行(09/03/2020 00:05:03.364)まで、6行()から4行()までのタイムスタンプ差を計算する必要があります09/03/2020 00:20:03.860。つまり、「集計」と関連する「更新」の時間差を計算する必要があります。09/03/2020 00:20:03.598ログエントリの。

次のプログラムを試しましたが、awk期待どおりに機能せずにどのように使用するのかわかりませんawk

awk '$3 == "Aggregated" {Agg_date=$1" "$2;Aggregated=$4}
     $3=="Flushed" {Flush_date=$1" "$2;Flushed=$4} 
     $4=="S20_SessionClassAggregation" {S20_Flushed=$9}
    {printf Aggregated" "S20_Flushed" "Flushed " "Flush_date" "Agg_date "\n"}' test.txt 

予想される結果:

Aggregated  S20_Flushed   Flushed      Flush_date             Agg_date                  Tme difference between
                                                                                        Flushdate - Agg_date

1000        500            1000       09/03/2020 00:05:03.582 09/03/2020 00:05:03.364  0 min 0 sec 218 ms

2000        1000           2000       09/03/2020 00:20:03.860 09/03/2020 00:20:03.598  0 min 0 sec 262 ms
.
.
.

答え1

以下は、あなたが要求した計算を実行するためにGNU awkを使用する方法ですmktime()

$ cat tst.awk
$3 == "Aggregated" {
    aggDt = $1 " " $2
}

$3 == "Flushed" {
    fluDt = $1 " " $2
    aggMs = dt2ms(aggDt)
    fluMs = dt2ms(fluDt)
    difMs = fluMs - aggMs
    print fluDt, aggDt, difMs
}

function dt2ms(dt,      t, ms) {
    split(dt,t,"[/ :.]")
    ms = mktime(t[3]" "t[1]" "t[2]" "t[4]" "t[5]" "t[6]) * 1000 + t[7]
    return ms
}

$ awk -f tst.awk file
09/03/2020 00:05:03.582 09/03/2020 00:05:03.364 218
09/03/2020 00:20:03.860 09/03/2020 00:20:03.598 262

msを必要な分/秒/ミリ秒形式に変換し、既存のスクリプトと同様に、必要な形式で必要な他の情報を追加する方法を理解できることを確信しています。

答え2

ちょうど数学をしてみてください。各行のタイムスタンプを分割し、真夜中以降の時間(ミリ秒を含む)を計算します。

function getSecs (Ts, Local, V) {

    split (Ts, V, /:/);
    return (3600 * V[1] + 60 * V[2] + V[3]);
}

各行に対して呼び出します。

Secs[NR] = getSecs( $2);

これにより、行番号でインデックス付けされた配列が提供されます。必要な唯一の修正は、タイムスタンプが後方に移動する場合は真夜中に実行し、比較に86400を追加する必要があることです。ログが終日スキップできる場合は機能しませんが、ここでは問題にならないようです。

GNU/awkするちょっと頑張ればデートがちゃんとできます。データを文字列のように並べ替えてにYYYY MM DD HH MM SS [DST]渡すと、mktime()エポック以降の秒数が得られます。すべてのフィールドを調整できます(たとえば、月の値に19を加え、日数から73を減算します)、内部的に調整されます。希望の形式で出力を使用できますstrftime()。 (ミリ秒は別途追加する必要があります。)

関連情報