파일을 관찰하고 해당 파일의 변경 사항에 따라 명령을 실행합니다.

파일을 관찰하고 해당 파일의 변경 사항에 따라 명령을 실행합니다.

주어진 파일에 키워드가 나타날 때 명령을 실행하는 방법을 찾고 있습니다 temp.txt. 예를 들어 지금까지는 이것을 시도했습니다 tail -F temp.txt | awk '/keyword/ {echo found}'. 원하는 목표는 echo found포함된 새 행이 추가될 때만 실행하는 것입니다. 기본 명령을 사용하여 가장 간단한 솔루션을 찾고 싶습니다.temp.txtkeyword

이 링크된 게시물의 답변이 제가 원하는 답변인 것 같지만 제게는 효과가 없고 그 이유도 이해가 되지 않습니다.

로그에 특정 텍스트가 나타날 때 로그를 따르고 명령을 실행하는 가장 좋은 방법

답변1

노력하다:

while :; do awk '/keyword/{print "found"}'; sleep 1; done < temp.txt

또는 단순히 "found"를 인쇄하는 대신 쉘 명령을 실행하려는 경우:

while :; do awk '/keyword/{system("echo \047found\047"}'; sleep 1; done < temp.txt

강제 POSIX 명령을 사용하며 모든 Unix 시스템의 모든 셸에서 작동합니다. 예를 들어:

$ echo foo > temp.txt

$ while :; do awk '/keyword/{print "\n>>> found <<<\n"}'; sleep 1; done < temp.txt &
[1] 16520

$ echo keyword >> temp.txt
$
>>> found <<<

바라보다https://unix.stackexchange.com/a/629912/133219이 방법에 대한 추가 정보.

"키워드"가 파일에 자주 나타나지 않고 CPU 주기를 사용하여 백그라운드에서 루프가 회전하는 것에 관심이 있는 경우 루프가 실행될 때마다 절전 값을 최대값으로 두 배로 늘려 보다 이국적인 절전 값을 얻을 수 있습니다. 키워드를 찾을 수 없으므로 코드는 다음 bash 코드와 유사하게 실행하는 것보다 잠자는 데 훨씬 더 많은 시간을 소비하지만 모든 셸에 대해 작성할 수 있습니다.

secs=1
maxSecs=60
while :; do
    if awk '/keyword/{print "found"; f=1} END{exit !f}'; then
        secs=1
    else
        if (( (2*secs) < maxSecs )); then
            secs=$(( 2*secs ))
        else
            secs=$maxSecs
        fi
    fi
    sleep "$secs"
done < temp.txt

"키워드"가 파일에 빠르게 나타나면 초당 한 번씩 awk를 실행하고, 그렇지 않으면 "키워드"가 다시 나타나기 시작할 때까지 1분마다 awk를 호출하는 루프를 반복한 다음 1분마다 다시 한 번 awk를 호출하기 시작합니다. 당연히 maxSecs를 5, 30, 3600 등 원하는 대로 설정하세요.

관련 정보