주어진 파일에 키워드가 나타날 때 명령을 실행하는 방법을 찾고 있습니다 temp.txt
. 예를 들어 지금까지는 이것을 시도했습니다 tail -F temp.txt | awk '/keyword/ {echo found}'
. 원하는 목표는 echo found
포함된 새 행이 추가될 때만 실행하는 것입니다. 기본 명령을 사용하여 가장 간단한 솔루션을 찾고 싶습니다.temp.txt
keyword
이 링크된 게시물의 답변이 제가 원하는 답변인 것 같지만 제게는 효과가 없고 그 이유도 이해가 되지 않습니다.
답변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 등 원하는 대로 설정하세요.