Verifique qual string ocorre primeiro em um arquivo crescente

0

Estou executando um executável remoto que produz um arquivo de log.

Eu quero escrever um script para verificar se o executável foi executado com sucesso ou se encontrou um erro. A maneira como posso fazer isso é observando o arquivo de log crescente e verificando se a string "error" ou "success" ocorre primeiro.

Eu sei que posso usar um arquivo em tempo real usando

tail -f output.log | grep --line-buffered "string"

No entanto, posso escrever um script que me diga se o grep para "error" ou o grep para "success" ocorre primeiro?

    
por Eddy 11.06.2014 / 12:55

3 respostas

0

Pesquise pelas duas strings usando grep, extraia os números de linha da primeira correspondência e compare os valores.

    A opção
  • grep -n fornece o número da linha de todas as correspondências.
  • opção -m1 lista apenas a primeira correspondência e sai.
  • por acaso, a opção -F fast grep - pode ser útil se não forem necessárias expressões regulares no cadeia de pesquisa.

Um exemplo de saída do erro grep será parecido com algo - o número da linha 235 deve ser extraído da saída.

235:[Wed Jun 04 12:23:19 2014] [error] child pid 6575 Segmentation fault (11)

Os números de linha podem ser extraídos excluindo a correspondência de substring mais longa %%:.* da saída para deixar os valores numéricos que são comparados na instrução if.

er_match=$(tail -f output.log | grep -n -F -m1 --line-buffered "error")
ok_match=$(tail -f output.log | grep -n -F -m1 --line-buffered "success")

if [[ ${er_match%%:.*} - gt ${ok_match%%:.*} ]];then
    echo "error first"
else
    echo "sucess first"
fi
    
por 11.06.2014 / 13:25
0

Você pode fazer isso observando apenas o primeiro resultado retornado por grep , por exemplo, com head -n1 :

status=$(grep -o 'success\|error' output.log | head -n1)
if [[ $status == "success" ]]; then
    # Program started successfully
else
    # Program encountered an error
fi
    
por 11.06.2014 / 13:25
0

Se você usar o egrep , poderá verificar se há uma sequência em cada linha:

egrep 'success|failure'

Isso trará as linhas em ordem, e você pode canalizar a saída para algo para selecionar a primeira linha.

    
por 11.06.2014 / 14:02