awk를 사용하여 자주 발생하는 모든 시간 간격 사이의 데이터를 읽는 방법

awk를 사용하여 자주 발생하는 모든 시간 간격 사이의 데이터를 읽는 방법

다음 형식의 로그 파일이 있습니다.

[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,gsubdate명령 형식을 준비하려면 필드에서 기호를 제거하세요.
  • date필드를 초로 변환(EPOCH에서)
  • |getline d위 내용을 d변수 에 넣어주세요

관련 정보