날짜, 시간, 문자열을 확인하고 메일을 실행하는 스크립트를 만듭니다.

날짜, 시간, 문자열을 확인하고 메일을 실행하는 스크립트를 만듭니다.

스크립트를 생성해야 합니다. 로그 파일의 마지막 몇 줄을 가져와서 시작 날짜의 마지막 줄에 오늘 날짜 및 시간 17:00:xx가 포함되어 있고 그 뒤에 업데이트된 xxxxx 줄이 있는지 확인하고 싶습니다. 그리고 제출하여 완료하세요. 스크립트는 현재 날짜 및 시간(17)에 "Row Completed" 문자열이 포함되어 있는지 확인합니다. 이메일이 트리거되지 않는 경우.

다음은 로그 파일의 형식입니다.

Start Date, Tue Jan 28 17:00:01 +03 2019
23468 rows updated.
Commit complete. 
--------------------------------------------
Start Date, Tue Jan 28 21:00:01 +03 2019
13369 rows updated.
Commit complete. 
--------------------------------------------
Start Date, Tue Jan 29 17:00:01 +03 2019
33099 rows updated.
Commit complete.
--------------------------------------------
Start Date, Tue Jan 29 21:00:01 +03 2019
21970 rows updated.
Commit complete.

다음은 내가 시도한 코드입니다.

TIME=$(date '+%H%M')

l=$(cat /Data/v3/currlog.txt | grep "rows updated." | wc -l)

if [ $l -eq 0 ] && [ $TIME -eq 1700 ] ; then
echo "Please check if the records are updated" |  mailx -S  "check the rejection script" [email protected]

fi

그러나 위의 스크립트는 내 목적을 해결하지 못합니다.

내 요구 사항을 명확히하려면 다음을 수행하십시오.

오늘 로그 파일(currlog.txt)이 다음과 같이 업데이트되었다고 가정합니다.

Start Date, Sat Feb  2 05:00:01 +03 2019
2708722 rows updated.
Commit complete.

이제 스크립트가 6시에 실행되도록 예약해야 합니다. 행이 5에서 업데이트되었는지 확인해야 합니다. 그렇지 않은 경우 이메일이 실행되어야 합니다.

로그 파일은 매일 동일한 형식으로 업데이트됩니다.

답변1

내가 취한 접근 방식은 로그에서 마지막 세 줄을 추출한 다음 그 세 줄에 오늘의 타임스탬프가 포함되어 있는지 확인하는 것이었습니다.

#!/bin/bash

today_time=$(date -d 'today 5 PM' '+%a %b %e %H:%M')

if ! tail -n3 /Data/v3/currlog.txt | grep "$today_time" &> /dev/null ; then
        echo "Please check if the records are updated" |  mailx -S  "check the rejection script" [email protected]
fi

GNU date명령은 현재 날짜 오후 5시에 날짜 문자열을 가져오는 데 사용됩니다. 지정된 형식은 날짜를 "2월 2일 토요일 17:00"으로 출력하며, 이는 로그 파일의 타임스탬프를 기반으로 검색할 수 있습니다.

답변2

다음 명령을 사용하여 확인하면 훌륭하게 작동합니다.

 d=`date +"%d"`
 m=`date +"%b"`
y=`date +%Y`
awk -v d="$d" -v m="$m" -v y="$y" '$4 ==  m && $5 == d && $NF == y && $6 ~ /^17/ {x=NR+2}(NR<=x){print }' filename

관련 정보