Parando após a primeira linha de saída

3

Eu tento fazer o seguinte em um script Bash: execute um comando (como tail -f log_file ), espere até que uma saída específica chegue, então pare o comando e continue com o script.

Eu tentei o seguinte, mas não funcionou:

tail -f log_file | grep some_text | head -n1

Eu não tenho saída dessa maneira.

Agora, tentei diagnosticar o problema. Quando simplesmente executo tail -n1 , depois digito algo no terminal, ele sai depois da primeira linha. No entanto, se eu executar o seguinte:

grep some_text | head -n1

Nesse caso, não recebo saída até que eu pressione CTRL + D e, em seguida, imprima a primeira linha da entrada contendo some_text .

Minha pergunta é: por que isso acontece? Se head produzir a primeira linha imediatamente no primeiro caso, por que ela não faz quando recebe a entrada de um cano? Não deveria dar saída a tudo para as primeiras linhas n , depois sair, enviando um sinal SIGPIPE para a outra extremidade do canal?

    
por petersohn 09.06.2011 / 16:23

2 respostas

2

grep armazena sua entrada. Experimente grep --line-buffered .

Existe um problema adicional, head só terminará depois de receber uma segunda linha, o que pode ser um problema se o seu arquivo de registro for de baixa frequência. Veja Como ler uma linha de tail -f por meio de um pipeline e, em seguida, terminar? .

    
por 09.06.2011 / 17:10
0

Quando você executa tail -n1 sem entrada, ele sairá após a primeira linha de entrada de STDIN, é assim que deve funcionar. Quando você executa grep some_text | head -n1 você não está fornecendo nenhuma entrada para grep , então parece que o comportamento que eu acho que você está descrevendo é normal. Quando você pressiona CTRL D, você está fechando o canal STDIN e head -n1 está exibindo o que 'grep recebido de STDIN.

    
por 09.06.2011 / 16:35