로그 파일에서 마지막 5분 동안의 정보를 추출합니다.

로그 파일에서 마지막 5분 동안의 정보를 추출합니다.

내 시스템 날짜 형식:

Thu Jun 13 12:55:18 EDT 2019

내 로그 형식:

193.118.26.141 - - [01/May/2019:00:08:49 -0400] "GET / HTTP/1.1" 200 27

마지막 5분 동안의 로그를 얻는 방법을 알려줄 수 있나요?

답변1

많은 텍스트 처리와 시간 조작이 필요하므로 이 작업은 를 사용하여 수행해야 하지만 작업하려면 awk여전히 외부 명령이 필요합니다 .date

다음 awk프로그램(우리는 이라고 부름 parse_log_range.awk)이 작동합니다:

#!/bin/awk -f
BEGIN{
    "date +%s" | getline now
    close("date +%s")
}

{
    n=match($0,/\[[^]]+\]/)
    tst=substr($0,n+1,RLENGTH-2)

    gsub(/\//," ",tst)  # replace all '/'
    sub(/:/," ",tst)    # replace first ':'
    
    cmd="date +%s -d \"" tst "\""
    cmd | getline tst_s; close(cmd)

    if (now-tst_s<max_age) print
}

처음에는 date +%s셸에서 명령을 실행하여 현재 시간을 쿼리하고 이를 변수에 저장합니다 now.

로그 파일의 각 줄에 대해 다음이 수행됩니다.

  • 타임스탬프를 중간 요소로 추출[ ... ]
  • 형식을 이해하기 쉽게 만들려면 /및 먼저 제거하세요.:date
  • 타임스탬프를 "에포크 이후 초"로 변환하는 셸 명령을 만듭니다.date +%s -d edited timestamp
  • 셸에서 이 명령을 실행하고 결과를 변수로 읽어옵니다.tst_s

max_age그런 다음 타임스탬프가 Far 보다 작은지 확인합니다 now. 지정해야 하는 시간 범위는 어디 max_age입니까(예: 5분 = 300초).

실행 명령은

awk -v max_age=300 -f parse_log_range.awk logfile.txt

관련 정보