Como retornar 0 se um padrão é correspondido de um arquivo? [duplicado]

2

Eu tenho um binário que repila o kernel do Android (não o mkbootimg). Eu estou fazendo um script para automatizar o processo.

Eu não quero nenhuma saída na tela. Por isso redirecionei a saída para um arquivo chamado foo.log.

O comando é - kernel_make "$zImage" "$ramdisk" "$cmdline" "$image" &> data/local/working/foo.log

Minha pasta de trabalho atual é data/local/working/ . O que eu tenho que fazer é, se a última linha da saída (foo.log) é isso -

"targed file $1 is patched sucesfully, enjoy new kernel"

Em seguida, retorne 0 e saia. Novamente, retorne 1 e saia.

Estou tentando fazer com o grep, mas como sou novo na linha de comando, não tenho a menor idéia de fazer isso da maneira certa.

    
por Chinmay Kunkikar 23.01.2015 / 16:36

2 respostas

1

grep é o caminho a seguir, ele retorna 0 se uma correspondência for encontrada. Você não precisa realmente enviar a linha, então descarte a linha e use o teste. No seu caso, seria apenas

lastline=$(tail -n1 logfile)
if grep pattern <<<"$lastline" &>/dev/null; then
    echo "yay, found pattern"
else
    echo "darn"
fi

Observe a construção "aqui string" <<< que apresenta a string como um arquivo para grep ler e &> que redireciona a saída padrão e a saída de erro (redirecionar para nulo neste caso). Padrão poderia ser "curtir" ou algo assim. Substitua os ecos com o seu tratamento personalizado.

No entanto, faria muito mais sentido apenas verificar se kernel_make retorna 1 se falhar. Não há necessidade de analisar uma saída de log amigável (que provavelmente será alterada ou deixará de ser a última mensagem). Se esse for o caso (mais provável), eu acabei de fazer

kernel_make [...arguments...] && echo "yay" || echo "nay"

(ou uma declaração if, como no caso grep). E você provavelmente está familiarizado com a declaração exit , que provavelmente usará no formulário exit 1 no caso de falha.

Se kernel_make for a última linha do script, você nem precisa fazer nada ...

    
por 23.01.2015 / 16:59
2

Grep sai por padrão com 0 na correspondência e 1 sem correspondência . Como tal, você poderia fazer:

grep -q "targed file \ is patched sucesfully, enjoy new kernel" foo.log

O -q suprime qualquer saída.

Para testar, diga algo como:

grep -q "targed file \ is patched sucesfully, enjoy new kernel" foo.log && echo OK || echo BAD

Se o $1 for realmente substituído por um nome de arquivo, você poderá substituir \ por algo como .* ou \S\+ .

Você também pode querer considerar corrigir (verificar):

targed     -> target
sucesfully -> successfully

Como observado no comentário, isso coincide com o arquivo inteiro. Use tail conforme expresso por @orion.

    
por 23.01.2015 / 16:59