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.

したがって、行が存在する場合、終了状態はゼロです。 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

関連情報