최신 파일에 대한 Grep 문자열 및 발견된 경우 경고/이메일

최신 파일에 대한 Grep 문자열 및 발견된 경우 경고/이메일

텍스트 기반 파일이 많이 포함된 폴더에서 "FCE-Error" 문자열을 가져오고 싶습니다.

폴더는 이렇게 생겼어요

-rw-r--r-- 1 root root        0 May 22 10:30 T201805220930.CIR
-rw-r--r-- 1 root root 11298297 May 22 10:40 T201805220935.CDR
-rw-r--r-- 1 root root        0 May 22 10:35 T201805220935.CIR
-rw-r--r-- 1 root root 12230924 May 22 10:45 T201805220940.CDR
-rw-r--r-- 1 root root        0 May 22 10:40 T201805220940.CIR
-rw-r--r-- 1 root root 12707339 May 22 10:50 T201805220945.CDR
-rw-r--r-- 1 root root        0 May 22 10:45 T201805220945.CIR
-rw-r--r-- 1 root root 13080477 May 22 10:55 T201805220950.CDR
-rw-r--r-- 1 root root        0 May 22 10:50 T201805220950.CIR
-rw-r--r-- 1 root root 13762418 May 22 11:00 T201805220955.CDR
-rw-r--r-- 1 root root        0 May 22 10:55 T201805220955.CIR
-rw-r--r-- 1 root root 13582035 May 22 11:05 T201805221000.CDR
-rw-r--r-- 1 root root        0 May 22 11:00 T201805221000.CIR
-rw-r--r-- 1 root root 13910251 May 22 11:10 T201805221005.CDR
-rw-r--r-- 1 root root        0 May 22 11:05 T201805221005.CIR
-rw-r--r-- 1 root root  3360658 May 22 11:11 T201805221010.CDT
-rw-r--r-- 1 root root        0 May 22 11:10 T201805221010.CIT

5분마다 새 파일 생성 CDT 파일 = 실시간 실행 로그 파일 CDR 파일 = 새 파일을 생성하기 전의 이전 CDT 파일

이 문자열 FCE-Error를 찾으려면 .cdt 또는 cdr 파일을 grep하는 bash 스크립트가 필요합니다.

긍정적인 값/항목이 발견되면 이메일을 통해 알림을 보내야 합니다.

답변1

파일이 현재 디렉토리에 있고 다음을 사용하고 있다고 가정합니다 bash.

files=( T*.CDT )
grep 'FCE-Error' "${files[-1]}"

.CDT그러면 해당 문자열에 대한 최신 파일이 검색됩니다. 다른 유형의 파일에도 동일한 작업을 수행할 수 있습니다.

쉘 와일드카드 패턴은 T*.CDT사전순으로 정렬된 일치하는 모든 파일 이름으로 확장되며, 일반 파일 이름(올바른 정렬의 올바른 타임스탬프 포함)을 사용하고 있으므로 마지막 파일이 최신 파일이 됩니다.

문자열이 발견되면 이메일을 통해 경고를 보냅니다.

files=( T*.CDT )
if grep -q 'FCE-Error' "${files[-1]}"; then
    mail -s 'Alert' [email protected] <<END_MESSAGE
We've found "FCE-Error" in ${files[-1]}, do something!
END_MESSAGE
fi

다른 POSIX 셸을 사용하세요.

set -- T*.CDT            # set positional parameter to all matching filenames
shift "$(( $# - 1 ))"    # shift off all but the last filename
if grep -q 'FCE-Error' "$1"; then
    mail -s 'Alert' [email protected] <<END_MESSAGE
We've found "FCE-Error" in $1, do something!
END_MESSAGE
fi

답변2

내 생각에 이것은 다음과 같아야합니다.

[ $(find /path/to/dir -cmin -5 -type f -exec grep -F 'FCE-Error' {} \; | wc -l) -gt 0 ] && mail [...] # I let you complete mail command

이 줄은 지난 5분(-cmin -5) 이내에 생성된 파일(-type f)을 검색(찾기)하며, grep 실행마다 출력을 wc로 전달하여 줄 수를 계산하고 전체 결과를 비교합니다. 0(-gt)으로 설정하면 true인 경우 mail 명령이 트리거되어 메일을 보냅니다.

5분마다 cron에서 실행되도록 이 명령을 설정할 수 있으며 중복 경고를 방지해야 합니다(경고가 막 발생하고 cron이 제 시간에 맞춰지지 않는 몇몇 극단적인 경우)

답변3

가장 최근의 .cdt/cdr 파일만 grep하시겠습니까?

dir=/path/to/files
lastCIR="$(find ${dir} -type f -name '*.CIR' | tail -1)"
lastCDR="$(find ${dir} -type f -name '*.CDR' | tail -1)"

if grep FCE-Error "${lastCIR}" || grep FCE-Error "${lastCDR}";then
  echo 'alert' | mail -s subject [email protected]
fi

관련 정보