지난 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이는 601번 호출(및 내장된 printf) 하기 때문에 무차별 공격입니다 . %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' | ..."

추가 이점으로 각 수표에서 전체 로그를 읽을 필요가 없습니다.

관련 정보