Como usar se com grep -x

0

Este é o meu código:

if grep -x $idle | grep -x $dead | grep -x $busy ./Event.log
 then 
   echo " Events are running Successfully" >> ./Event.log
 else 
   echo "One or more Events are down. Check the log and restart the Events." >> ./Event.log
fi

Estou recebendo o erro abaixo:

grep: 0652-033 Cannot open 1.
grep: 0652-033 Cannot open 0.
grep: 0652-033 Cannot open 0.

Mesmo quando a condição if é satisfeita, ela vai para o bloco else .

Alguém pode me ajudar nisso?

    
por Hanish 23.08.2015 / 17:51

2 respostas

1

O comando grep recebe dois argumentos: padrão e arquivo . O arquivo pode ser omitido se a entrada estiver conectada a stdin com o canal | ou o redirecionamento < . Em seus exemplos, esse não é o caso, portanto, o primeiro grep não sabe onde procurar por padrão. Você precisaria escrever:

grep -x $idle Event.log | grep -x $dead | grep -x $busy

Observe que o segundo e o terceiro grep s não precisam de argumento de arquivo ao ler o pipe.

No entanto, no seu caso, acho que você prefere procurar três strings alternativas. Assim, você pode usar o operador alternativo | com grep -E ou \| sem -E , por exemplo:

if grep -x "$idle\|$dead\|$busy" ./Event.log >/dev/null
    then
    echo " Events are running Successfully" >> ./Event.log
else
    echo "One or more Events are down. Check the log and restart the Events." >> ./Event.log
fi
    
por 23.08.2015 / 18:37
0

Você provavelmente desejará citar o regex (para evitar regras de divisão de palavras shell), desabilitar opções (para evitar que os hífens na regex sejam tratados como opções para grep ) e indicar formalmente que stdin está sendo usado.

$ x="hi there"; (echo hi there; echo bye there) | grep -- "$x" -
hi there

Se você só precisa do resultado para a condição de teste, a opção -q para grep também pode ser relevante.

    
por 23.08.2015 / 18:06

Tags