Cómo seguir / grep / awk los últimos N bytes de un archivo, en lugar de líneas

13

Tengo una aplicación que inicia sesión en un archivo de registro de texto sin formato (myapp.log) pero no parece estar escribiendo nuevos caracteres de línea al final de cada entrada de registro. Si ejecuto un comando como tail -n 50 myapp.logsi realmente recibiera cientos de "líneas" de texto (entradas de registro).

Este archivo de registro es muy grande, aproximadamente 1 GB, quién sabe hace cuánto tiempo se insertó el último CR y / o LF. ¿Cómo puedo decir, por ejemplo, los últimos 2 MB?

jwbensley
fuente

Respuestas:

26

Usando el -cconmutador (2MB = 2 * 1024 * 1024 = 2097152 bytes):

tail -c 2097152 myapp.log

Gracias a Petr Uzel por la sugerencia. Algunas implementaciones de cola permiten agregar una unidad para imprimir los últimos kilobytes (k) o megabytes (m), como:

tail -c 2m myapp.log

Sin embargo, tenga en cuenta que no es estándar (en ninguno de POSIX, UNIX (SUS) o Linux (LSB)) y no es portátil. También tenga en cuenta que, dado que los términos "mega" / "kilo" ... y sus abreviaturas (M, k ...) tienen significados ambiguos (1000 vs 1024), no hay mucha garantía de lo que tal o cual aplicación del tailsignificará por 2m(aunque las versiones actuales de las implementaciones actuales que lo soportan parecen ir a la variante 1024).

Birei
fuente
55
Tail debería poder aceptar números con unidades como argumento para el interruptor c, por lo tail -c 2M myapp.logque también debería funcionar.
Petr Uzel
@PetrUzel: Gracias. Editó la respuesta para agregarla.
Birei
Ahora me siento tonto :) Gracias por la rapidez, realmente aprecio eso. Gran sugerencia!
jwbensley
1
Perfecto, no estoy seguro de si esto ayudará, pero agregaré esta cadena de texto porque es lo que buscaba para llegar hasta aquí (tardó un buen rato): "datos del archivo cat entre dos posiciones de byte (no líneas) "
Torxed