Faz loop até que o grep não encontre o texto em um arquivo

2

Eu tenho um arquivo chamado file.txt . O conteúdo do arquivo é o seguinte

sunday
monday
tuesday

Eu escrevi o script abaixo e ele é muito bem se o grep não puder encontrar o padrão que foi mencionado

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

Mas minha exigência é que o script acima faça um loop até que o texto mencionado no padrão grep desapareça no file.txt

Eu tentei usar o L flag com grep. Mas não funcionou.

until cat file.txt | grep -EL "sunday" -C 9999; do sleep 1 | echo "working..."; done
    
por Damien-Amen 16.11.2016 / 02:28

2 respostas

7

Da página de manual 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.

Assim, se uma linha estiver presente, o status de saída será 0. Já que bash 0 é verdadeiro (porque o status de saída padrão "bem-sucedido" dos programas é 0) você deve ter algo como:

#!/bin/bash

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

Por que exatamente você está canalizando sleep 1 para echo ? Embora funcione, não faz muito sentido. Se quisesse que eles estivessem em linha, você poderia escrever sleep 1; echo "working..." e se quisesse que o echo fosse executado antes do atraso, você poderia tê-lo antes da chamada sleep como echo "working..."; sleep 1 .

    
por 16.11.2016 / 02:50
1

Isso deve fazer o trabalho:

#!/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
    
por 16.11.2016 / 02:53