다음과 같은 로그 파일이 있으며 지속적으로 기록됩니다.
2021-08-12 16:09:17 textsp sdgg
reponse:success
prams:invalid
2021-08-12 16:10:17 textdfdfdlfs sfdfs
reponse: failed
prams:valid
5분 전의 로그를 가져오는 스크립트를 작성하고 싶습니다. 하지만 여전히 모르겠습니다. 라인에는 응답 매개변수가 포함되어 있고 유모차에는 시간이 없으므로 필터링하기가 어렵습니다. 이 사건에 대해 어떻게 생각하시나요?
답변1
GNU를 사용하면 date
다음 awk
을 수행할 수 있습니다.
START=$(date -d '5 minutes ago' +'%F %T') \
LC_ALL=C awk '
/^[0-9]{4}(-[0-9]{2}){2}/ && $0 >= ENVIRON["START"], 0
' < file.log
awk 'start, end {action}'
시작 및 끝 범위 내의 라인에서 실행하기 위해 작업을 사용 하지만 여기에는 작업이 지정되지 않으며 기본적으로 라인 0(의미)이 인쇄됩니다.잘못된)를 종료 조건으로 사용하고 타임스탬프처럼 보이고 5분 전의 타임스탬프보다 큰 것으로 시작하는 첫 번째 줄로 시작합니다.
두 타임스탬프 사이의 로그의 경우:
START=$(date -d '15 minutes ago' +'%F %T') \
END=$(date -d '5 minutes ago' +'%F %T') \
LC_ALL=C awk '
match($0, /^[0-9]{4}(-[0-9]{2}){2} ([0-9]{2}:){2}[0-9]{2}/) {
timestamp = substr($0, RSTART, RLENGTH)
if (timestamp > ENVIRON["END"]) exit
if (timestamp >= ENVIRON["START"])
started = 1
}
started' < file.log
이는 로그 항목이 시간순으로 정렬되어 있다고 가정합니다. 항상 그런 것은 아닙니다. 예를 들어 타임스탬프는 작업 시작을 나타내지만 로그 항목은 작업 끝에 추가되며 일부 서버 소프트웨어는 여러 작업을 동시에 수행합니다.