seguirá o arquivo inteiro lido?

1

Eu quero ler um grande arquivo de log com 10000 linhas toda vez. e eu uso este comando:

tail -c +offset somefile | head -n 10000

minha pergunta é, com a cabeça cheia, vai ler o arquivo inteiro?

atualizado:

Eu sei que tail lerá a posição do offset.

o que eu quero saber é que:

se o arquivo tiver 20000 linhas restantes do deslocamento, e o cabeçote imprimir apenas 10000, a cauda lerá as 20000 linhas da esquerda? ou apenas ler as primeiras 10000 linhas?

    
por Zava 28.02.2014 / 03:58

2 respostas

4

tail morrerá de um sinal SIGPIPE assim que tentar gravar no pipe quando não tiver leitor.

Então tail morrerá logo após head ter finalizado suas 10000 linhas e sair.

Porque os pipes podem conter alguns dados (64kiB no Linux) e porque tail armazena sua saída quando não está em um terminal (8kiB no meu teste) e head e tail lêem sua entrada em blocos (de até 8kiB em meus testes), tail pode ler até 64 + 8 + 8 kiB após o fim da linha 10000 depois de offset antes de morrer.

O pior cenário é quando head é mais lento para esvaziar o canal do que tail é preenchê-lo (por exemplo, se gravar em uma saída lenta como um terminal) e se o último byte da linha 10000 é no início de um bloco 8kiB.

Em seguida, no final, head terá lido o bloco com a última nova linha no início (8191 bytes a mais do que o necessário), mas está ocupado escrevendo sua saída. tail , durante esse tempo preencheu o pipe (64kiB), leu outro bloco 8kiB, mas como o pipe está cheio está bloqueado escrevendo para ele. Assim que head escrever sua última linha e sair, tail morrerá, mas terá lido 64kB + 8 kiB + 8191 bytes após a última dessas 10.000 linhas.

O melhor cenário é quando a última das 10000 linhas está no final de um bloco de 8kiB e head lê os dados assim que é colocado no canal por tail . Então, se no último bloco, head conseguir lê-lo a partir do pipe e sair antes de tail escrever o próximo, então tail irá morrer ao escrever o próximo bloco, então ele lerá apenas 8192 bytes após o fim dessa linha 10000.

Isso pressupõe que somefile seja um arquivo comum. Ele poderia terminar mais cedo se somefile fosse algum arquivo especial que goteja um byte de cada vez, por exemplo (como um pipe de um while :; do echo; done )

    
por 28.02.2014 / 07:58
0

Não. E a colocação fora de uso não afetará de modo algum o que a cauda diz.

Com sua opção de deslocamento de caractere -c +offset tail procurará posicionar e ler a partir desse ponto.

    
por 28.02.2014 / 04:30

Tags