아래와 같은 로그 파일을 구문 분석해야 합니다.
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()
. (밀리초는 별도로 추가해야 합니다.)