Como tail / grep / awk os últimos N bytes de um arquivo, em vez de linhas

13

Eu tenho um aplicativo que está efetuando logon em um arquivo de log de texto sem formatação (myapp.log), mas não parece estar escrevendo novos caracteres de linha no final de cada entrada de log. Se eu executar um comando como tail -n 50 myapp.logeu, na verdade, recebo centenas de "linhas" de texto (entradas de log).

Esse arquivo de log é muito grande, aproximadamente 1 GB, quem sabe há quanto tempo o último CR e / ou LF foi inserido. Como posso simplesmente dizer, os últimos 2 MBs, por exemplo?

jwbensley
fonte

Respostas:

26

Usando o -ccomutador (2 MB = 2 * 1024 * 1024 = 2097152 bytes):

tail -c 2097152 myapp.log

Obrigado a Petr Uzel pela sugestão. Algumas implementações finais permitem adicionar uma unidade para imprimir os últimos kilobytes (k) ou megabytes (m), como:

tail -c 2m myapp.log

No entanto, observe que ele não é padrão (em nenhum dos POSIX, UNIX (SUS) ou Linux (LSB)) e não é portátil. Observe também que, como os termos "Mega" / "quilo" ... e suas abreviações (M, k ...) têm significados ambíguos (1000 vs 1024), não há muita garantia do que isso ou aquela implementação tailsignificará por 2m(embora as versões atuais das implementações atuais que suportam isso pareçam estar indo para a variante 1024).

Birei
fonte
5
A cauda deve ser capaz de aceitar número com unidades como argumento para a opção c, tail -c 2M myapp.logtambém deve funcionar.
Petr Uzel
@PetrUzel: Obrigado. Editou a resposta para adicioná-lo.
Birei
Agora me sinto boba :) Obrigado pela presteza, realmente aprecio isso. Ótima sugestão!
jwbensley
1
Perfeito, não tenho certeza se isso vai ajudar, mas eu adicionarei essa sequência de texto porque é o que eu era as palavras-chave que eu estava procurando para chegar aqui (demorou um bom tempo): "dados do arquivo cat entre posições de dois bytes (não linhas) "
Torxed 18/09/14