지난 10분 동안의 로그에 특정 패턴이 있는 줄 표시

지난 10분 동안의 로그에 특정 패턴이 있는 줄 표시

지난 10분 동안 오류가 발생한 행을 로그 파일에 표시해야 합니다.

Aug 26 10:50:42 Normal line.
Aug 26 10:51:23 Normal line.
Aug 26 10:55:33 Error line.
Aug 26 10:56:45 Normal line.
Aug 26 10:58:12 Error line.
Aug 26 11:02:31 Normal line.
Aug 26 11:03:32 Normal line.
Aug 26 11:04:11 Normal line.

위의 로그 파일 예를 고려하십시오. 다음 두 줄을 표시하고 싶습니다.

Aug 26 10:55:33 Error line.
Aug 26 10:58:12 Error line.

저는 AIX를 사용하고 있습니다.

답변1

두 가지 답변에 대해 Stéphane Chazelas에게 보내는 팁:

나는 지난 10분 동안 가능한 모든 타임스탬프 항목을 반복하는 무차별 대입 솔루션을 생각해냈습니다.

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%(%b %d %H:%M:%S)T\n' "$i seconds ago")
  grep "^${d} Error" logfile
done

grep(내장 printf와 함께) 601번 호출하기 때문에 무차별 공격입니다 . %T임의의 타임스탬프를 인쇄(및 형식화)하려면 printf 옵션을 지원하는 ksh93이 필요합니다 . 그러나 다음과 같은 극단적인 경우로 인해 날짜 계산을 직접 수행하는 것보다 쉽습니다.

  • 일 제한
  • 월 한도
  • 가능한 일광 절약 시간제 변경

답변2

@Jeff Schaller의 솔루션을 뻔뻔하게 표절하는 가능성이 있습니다. 단일 호출 grep이므로 아마도 조금 더 빠를 것입니다.

#!/bin/ksh93
for((i=0;i<=600;i++))
do
  d=$(printf '%s|%(%b %d %H:%M:%S)T' "${d}" "${i} seconds ago")
done
grep -E "^(${d:1}) Error" logfile

답변3

모든 답변에 감사드립니다. 다음 명령을 사용하여 필요한 작업을 수행했습니다.

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' logfile

여기서 d1과 d2는 위에서 초기화되었습니다. 나를 위해 일을 완료했습니다.

건배.

답변4

10분마다 마지막 10분 줄을 가져와야 하는 경우 다음을 사용할 수 있습니다.벌목 통나무로그 파일의 보이지 않는 꼬리 부분을 인쇄할 수 있는 도구입니다. 먼저 명령을 통해 파일 위치를 저장하십시오.

$ cutthelog logfile > /dev/null

그런 다음 로그는 cron 작업을 통해 처리됩니다.

*/10 * * * * root cutthelog logfile | grep 'Error line' | ..."

추가 보너스로 각 검사에 대해 전체 로그를 읽을 필요가 없습니다.

관련 정보