스크립트를 통해 마지막 5분 동안의 로그를 얻으려고 합니다.

스크립트를 통해 마지막 5분 동안의 로그를 얻으려고 합니다.

지속적으로 추가될 출력 로그 파일이 있고 출력 로그에서 마지막 5분 동안의 데이터를 검색하는 스크립트(5분마다 실행)를 가질 계획입니다.

출력 로그 파일의 샘플 데이터:

2015-10-29 09:19:39,630 INFO line1 of log  
2015-10-29 09:21:39,630 INFO line2 of log
2015-10-29 09:22:39,630 INFO line3 of log
2015-10-29 09:23:39,630 INFO line4 of log
2015-10-29 09:24:39,630 INFO line5 of log
2015-10-29 09:25:39,630 INFO line6 of log

09:25에 스크립트를 실행하면 마지막 5줄을 캡처하여 별도의 출력 파일로 보내야 합니다.

답변1

이것이 당신에게 필요한 것입니다:

five_min=$( date -d "5 minutes ago" +"%F %T" )
while IFS= read -r line; do
    [[ "$five_min" < "$line" ]] && echo "$line"
done < output.log

그래서 이것은 거대한 파일입니다. 그런 다음 tac맨 아래부터 파일을 출력하는 데 사용합니다 .

five_min=$( date -d "5 minutes ago" +"%F %T" )
tac output.log | while IFS= read -r line; do
    [[ "$five_min" < "$line" ]] && echo "$line"
done | tac

다른 언어와 마찬가지로 이 while명령은 조건이 true일 때 본문을 실행합니다. POSIX 셸에서는 ifand 명령의 "조건" while자체가 명령입니다. "조건"의 "진실"은 명령이 종료 상태 0으로 종료된다는 것입니다. [and라는 단어가 [[단순한 구문(bash 쉘 유형 help [[및 의 help [) 이 아니라 실제로 명령이라는 점을 인식하는 것이 매우 중요합니다.

이 답변에서 조건은 IFS= read -r line이것이 파일에서 줄을 읽고 모든 공백과 백슬래시 시퀀스를 그대로 유지하는 표준 방법이라는 것입니다. read입력 스트림에서 더 이상 읽을 내용이 없으면 0이 아닌 종료 상태가 반환됩니다. 첫 번째 응답에서는 로그 파일의 내용을 명령의 표준 입력으로 리디렉션 while하고 read해당 데이터를 읽습니다.

답변2

#!/bin/bash
#To get previous 5 minutes logs from now(IST)
d1=$(date –date="-5 min" +'%Y-%m-%d %H:%M:%S.%3N')
d2=$(date +'%Y-%m-%d %H:%M:%S.%3N') #Added missing closing parenthesis

awk -v d1="$d1" -v d2="$d2" '$0 > d1 && $0 < d2 || $0 ~ d2' /var/log/<file_name >  > /var/log/$<new_file_name>

관련 정보