지난 5분 동안 파일에 기록된 로그 줄을 어떻게 얻을 수 있나요?

지난 5분 동안 파일에 기록된 로그 줄을 어떻게 얻을 수 있나요?

다음과 같은 로그 파일이 있으며 지속적으로 기록됩니다.

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

이는 로그 항목이 시간순으로 정렬되어 있다고 가정합니다. 항상 그런 것은 아닙니다. 예를 들어 타임스탬프는 작업 시작을 나타내지만 로그 항목은 작업 끝에 추가되며 일부 서버 소프트웨어는 여러 작업을 동시에 수행합니다.

관련 정보