Erro no comando grep para sair de um script Unix

0

Eu tenho um arquivo de log criado durante a execução de um script.

Eu quero verificar o mesmo arquivo de log para qualquer mensagem com 'Msg ....' e sair do código, exceto com 'Msg 2714'.

Então, eu adicionei o código abaixo no meu script:

Some line of code before

rc1='grep -v 'Msg 2714' $Logfilename'
rc2='grep -i 'Msg' $rc1'

if [ $rc2 -ne "" ]
then
    echo "Error message, some query has failed"
    exit
fi

Mas, eu tenho encontrado um problema com o comando grep, mesmo que o segundo grep retorne nulo, o código de saída / código de retorno é '1', então o- "se os comandos falharem e o script existir".

Por favor, indique alguma sugestão se alguma coisa estava errada aqui?

Obrigado!

    
por Suresh 25.10.2018 / 16:09

1 resposta

3

Seu script usa o valor de $rc1 como um nome de arquivo, mas esta é a saída de grep .

Para alimentar a saída do primeiro grep em outro grep , use um canal:

grep -v ... filename | grep ...

Em vez de salvar o resultado de grep em variáveis (que podem ser bastante grandes), deixe o teste if agir diretamente sobre o resultado da execução desse pipeline:

if grep -v -F 'Msg 2714' "$Logfilename" | grep -q -F Msg; then
    echo 'Error message, some query has failed' >&2
    exit 1
fi

Isso usa o status de saída do pipeline (que será o status de saída de grep -q ) para determinar se o script deve exibir a mensagem de erro e sair. Nenhum dado precisa ser armazenado em variáveis.

grep -q não produzirá nada, mas sairá com sucesso se o padrão fornecido corresponder. Também usei -F com as invocações de grep , já que estamos combinando strings, não expressões regulares.

Também estou seguindo a diretriz geral de que as mensagens de erro são geradas no fluxo de erros padrão (com echo ... >&2 neste caso) e que o script terminará com um status de saída diferente de zero quando ocorrer um erro fatal.

Também possivelmente relevante, em relação à sua não-cotação de expansões variáveis:

por 25.10.2018 / 16:13

Tags