grep이 파일에서 텍스트를 찾을 수 없을 때까지 반복

grep이 파일에서 텍스트를 찾을 수 없을 때까지 반복

이라는 파일이 있습니다 file.txt. 내용은 다음과 같습니다.

sunday
monday
tuesday

grep언급된 패턴을 찾을 수 없으면 잘 반복되는 다음 스크립트를 작성했습니다.

until cat file.txt | grep -E "fdgfg" -C 9999; do sleep 1 | echo "working..."; done

하지만 내 요구 사항은 위의 스크립트가 패턴에 언급된 텍스트가 grep사라질 때까지 반복되어야 한다는 것입니다. file.txt

나는 Lgrep에서 이 플래그를 사용해 보았습니다. 그러나 그것은 작동하지 않았습니다.

until cat file.txt | grep -EL "sunday" -C 9999; do sleep 1 | echo "working..."; done

답변1

grep매뉴얼 페이지 에서 :

EXIT STATUS
   Normally the exit status is 0 if a line is selected, 1 if no lines were
   selected, and 2 if an error occurred.  However, if the -q or --quiet or
   --silent is used and a line is selected, the exit status is 0  even  if
   an error occurred.

따라서 행이 존재하면 종료 상태는 0입니다. Bash에서는 0이 true이기 때문에(프로그램의 표준 "성공" 종료 상태가 0이기 때문에) 실제로 다음과 같은 내용이 있어야 합니다.

#!/bin/bash

while grep "sunday" file.txt > /dev/null;
do
    sleep 1
    echo "working..."
done

도대체 왜 sleep 1파이프라인을 원하는 걸까요 echo? 작동하는 동안에는 별 의미가 없습니다. 인라인으로 만들고 싶다면 그냥 쓸 수 있고 , 지연되기 전에 실행되도록 sleep 1; echo "working..."하려면 다음과 같이 호출 앞에 넣을 수 있습니다 .echosleepecho "working..."; sleep 1

답변2

이 작업을 수행해야 합니다.

#!/bin/bash
while true ; do 
  echo "Working..."
  result=$(grep -nE 'sunday' file.txt) # -n shows line number
  echo "DEBUG: Result found is $result"
  if [ -z "$result" ] ; then
    echo "COMPLETE!"
    break
  fi
  sleep 1
done

답변3

다음은 나에게 효과적이었습니다. while 루프가 작동하지 않는 이유를 모르겠습니다.

until echo "$(kubectl -n production get pods -l=app='activemq' -o jsonpath='{.items[*].status.containerStatuses[0].ready}')" | grep -q "true"; do
   sleep 10
   echo "Waiting for Broker to be ready......................."
done

관련 정보