내 시스템 날짜 형식:
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