지속적으로 추가될 출력 로그 파일이 있고 출력 로그에서 마지막 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 셸에서는 if
and 명령의 "조건" 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>