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(). (밀리초는 별도로 추가해야 합니다.)

관련 정보