다음 형식의 로그 파일이 있습니다.
[30/Jan/2015:10:10:30 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 425
[30/Jan/2015:10:11:00 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 261
[30/Jan/2015:10:11:29 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 232
[30/Jan/2015:10:12:00 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 315
[30/Jan/2015:10:12:29 +0000] 12.30.30.204 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 221
[30/Jan/2015:10:12:57 +0000] 12.30.30.182 xff=- reqId=[-] status_check len=- GET /api/getstatus HTTP/1.1 mi=- ec=- 200 218
이 로그 파일의 각 줄에는 마지막 필드에 응답 시간이 있고 첫 번째 필드에 타임스탬프가 있습니다. awk
모든 특정 시간 간격에 대한 평균 응답 시간을 읽는 방법이 있습니까 ? 예를 들어 평균 응답 시간은 5분마다 계산됩니다.
나는 정적 방법이며 시간 간격의 평균만 제공하는 다음 방법을 시도했습니다.
$ grep "30/Jan/2015:10:1[0-4]" mylog.log | awk '{resp+=$NF;cnt++;}END{print "Avg:"int(resp/cnt)}'
하지만 전체 파일에 대해 5분을 모두 수행해야 합니다. 명령을 반복하더라도 명령에 날짜를 동적으로 전달하려면 어떻게 해야 합니까? 로그 파일과 그 안의 날짜는 매번 다르기 때문입니다.
아니면 이것에 대한 최선의 대안이 있습니까 awk
? 제안해주세요.
답변1
처음 종료 시 다음과 같은 상황이 발생할 수 있습니다.
awk -F"[][ ]*" -v it=300 '{
sub(":"," ",$2)
gsub("/"," ",$2)
"date +%s -d \""$2"\""|getline d
if (d-f>it) {
f=d
if (NR!=1)
print s/n
s=n=""
}
n++
s+=$NF
}' log.file
-F"[][ ]*"
다음과 같이 사용됨에프생산하다에스구분 기호는 대괄호를 추가로 제거합니다.-v it=300
변수 설정(초 단위 간격)sub,gsub
date
명령 형식을 준비하려면 필드에서 기호를 제거하세요.date
필드를 초로 변환(EPOCH에서)|getline d
위 내용을d
변수 에 넣어주세요