Como comparar qualquer string da saída através do shell script do comando unix

2

Eu recebo um arquivo de log assim que executo um comando (o processo ainda está sendo executado em segundo plano). Agora quero buscar o status (limpo ou não limpo) desse arquivo de log. Se o status estiver limpo, então deixarei o processo como está, se não estiver limpo, então tenho que matar o processo que foi iniciado pelo meu primeiro comando e executar novamente o mesmo comando novamente.

Eu tentei com cat logfilename | grep "un-clean" . Mas eu não sei como verificar essa saída no script de shell.

Eu quero algo como (aproximadamente) var= clean then the output of above command == var if yes then echo "ok" else re-run command

Eu tentei alguns dos comandos, mas não trabalhei para mim.

    
por Siddharth Tiwari 19.07.2016 / 15:38

2 respostas

3

Basicamente, você quer essa estrutura

if grep -q "un-clean"  /path/to/log_file.log ;
then
    # put some command in case we find result is unclean
else 
    # if the output is ok, do something else
fi

Tudo o que isso faz é silenciosamente (sem imprimir na tela) verificar se há uma correspondência da string "impura" no arquivo. Se existe a parte if, caso contrário - fazemos mais parte.

Veja um exemplo:

$> if grep -q 'root' /etc/passwd ; then  echo "This user exists" ; else echo "This user doesn't exist"; fi    
This user exists
$> if grep -q 'NOEXIST' /etc/passwd ; then  echo "This user exists" ; else echo "This user doesn't exist"; fi 
This user doesn't exist

O que também pode ser feito é iniciar o comando que você quer do script, mas em segundo plano. Dessa forma, podemos ter o PID. Aqui está o que eu quero dizer

$> echo "HelloWorld"   &                                                                                      
[1] 6876

Adicionar & faz com que echo "HelloWorld" seja executado em segundo plano, e nós temos o PID armazenado na variável $! . Assim, podemos fazer algo como

some-command  &
CMD_PID=$!
if grep -q "un-clean"  /path/to/log_file.log ;
then
         kill -TERM $CMD_PID
else 
        # if the output is ok, do something else
fi
    
por Sergiy Kolodyazhnyy 19.07.2016 / 15:42
0

Você tentou algo assim:

some-command  &
PID=$!
wait $PID
while grep -q un-clean filename.log ; do
  kill -TERM $PID
  some-command  &
  PID=$!
  wait $PID
done

o processo será eliminado (consulte killall : man killall ) e o comando re-run será executado enquanto o arquivo filename.log contiver a string un-clean .

Isso ajuda?

EDIT: poste atualizado usando a boa solução @Serg e inclua o comando wait para aguardar o final do comando antes de verificar o arquivo de log.

    
por yaap 19.07.2016 / 15:43