以下のログファイルを解析する必要があります。
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()
。 (ミリ秒は別途追加する必要があります。)