51 votos

Necesito examinar un archivo de texto de 82,7 GB (!). ¿Qué puede abrirlo?

Recientemente tuvimos una caída de un servidor Tomcat, que produjo un archivo de registro "catalina.out" de 82,7 GB, que guardé para un análisis forense.

¿Qué editores de macOS pueden abrir archivos de texto monstruosos sin consumir 80 GB de RAM o provocar congelaciones de 15 minutos?

17 votos

¿Necesita leer el archivo para ojearlo en busca de detalles o fallos interesantes o necesita buscar en el archivo? ¿Tiene el archivo una marca de tiempo consistente? Todas las respuestas que se dan a continuación son adecuadas, pero con más de 80 GB debería considerar algunas técnicas de análisis y búsqueda de registros para encontrar los datos que necesita para su análisis. Un ejemplo, pero fuera de tema, es la siguiente pregunta serverfault.com/questions/63297/good-free-tomcat-log-analyser

2 votos

0 votos

¿Sería razonable escribir un analizador para el archivo que extraiga los registros y los añada como filas en una base de datos? Las bases de datos están diseñadas para ordenar y buscar eficientemente millones de registros; los editores de texto no.

94voto

79E09796 Puntos 751

less filename

Desde la línea de comandos, permite ver los archivos directamente sin cargar el archivo completo en la memoria.

10 votos

GNU less sólo utiliza por defecto 64k de espacio en el búfer cuando se visualiza un archivo arbitrariamente grande. Supongo que el less en MacOS hace lo mismo, así que esta es una gran respuesta. less también tiene búsqueda regex, le permitirá paginar a través del archivo, y mucho más.

5 votos

Esto es exactamente lo que primero more y luego less se hizo para. También hay muchos atajos de navegación. El conjunto de herramientas de Unix es muy útil, y vale la pena aprenderlo.

7 votos

@WayneConrad less no es un programa estándar con múltiples implementaciones; less es el localizador GNU basado en more y es lo que viene con MacOS.

37voto

Tim Seed Puntos 461

No intentaría abrirlo... Prefiero hacerlo:

  1. grep - buscar algún texto
  2. dividir - cortar el archivo en trozos de, por ejemplo, 10Mb.

Algo así como:

grep "crash" My80GbFile.txt | more 

Si el archivo grande no está "delimitado por líneas"

split -b 10M My80GbFile.txt

Pero si el archivo grande es sólo una carga de líneas, entonces (como se publicó), dividir por línea (100.000 por sub-archivo) en este caso.

 split -l 100000 My80GbFile.txt

11 votos

Es posible que desee utilizar grep -C5 crash sólo para tener unas líneas de contexto encima y debajo de cada partido.

7 votos

Esto. No lo hagas abrir un archivo de 85 GB en un editor. Deshazte primero de toda la pelusa (sin comprometer el archivo original, por supuesto). Si el archivo es grande porque el tiempo de registro es largo, inspeccione el tiempo cerca del incidente. Si es grande porque es una instantánea de un gran estado del sistema, por ejemplo, volcado de una base de datos o algo así, intenta centrarte en los datos relevantes.

3 votos

Si el archivo está formado por líneas, en lugar de split -b sería mejor hacer split -l . De lo contrario, dividirías las líneas por la mitad.

26voto

Oskar Puntos 1242

En cuanto a sus necesidades inmediatas, el mejor editor visual gratuito para MacOS es BBEdit (enlazado a la descarga de la Mac App Store) y hace muchas cosas - un verdadero centro de poder. Una vez que lo tienes, también puedes pagar por las características pro / automatización / fuera de la gratitud, pero es gratis para siempre si quieres y te gusta ese precio.

También utilizo vi para editar cosas, pero eso abre una lata de gusanos para necesitar el shell, la aplicación terminal u otra aplicación y algo de estudio para aprender cómo salir del editor (tldr; pruebe ZZ o ZQ), personalícelo y enseñe a su cerebro a pensar en operar sobre el texto en abstracto en lugar de utilizar el ratón para seleccionar elementos. Además, un localizador como less o more o bat también es muy amigable para comenzar y navegar por archivos masivos. (Y bate te da alas colores impresionantes y conocimiento de la sintaxis ).

brew install bat

En tu caso, la aplicación de la consola que viene con MacOS también podría valer la pena si puedes usar la funcionalidad de búsqueda allí. Inicia la aplicación desde Spotlight y arrastra tu archivo monstruoso a la ventana para echar un vistazo.

10 votos

+1 para BBEdit -- el equipo de BareBones ha optimizado específicamente esta aplicación para tratar con archivos de texto masivos a lo largo de los años.

10 votos

Por favor, añada si este editor puede realmente abrir un archivo de registro "catalina.out" de 82,7G. Y si requiere 85G de RAM.

0 votos

@reinierpost La probabilidad de que alguien tenga un archivo de registro enorme dando vueltas es escasa. No estoy seguro de que nadie más que el consultante pueda confirmarlo adecuadamente.

12voto

Hobbamok Puntos 221

No lo hagas (ábrelo como un solo archivo)

¿Hay alguna razón específica por la que no se pueda simplemente dividir en trozos de aproximadamente 1GB con un script?

Sí, las búsquedas y otras funciones similares se verán afectadas, pero eso ya será así con un archivo de 80 GB.

Si tienes puntos de ruptura específicos en el script (días en el timestamp, mensajes de inicio/apagado) también podrías dividirlo para eso. De esta manera, probablemente incluso obtendría un significado adicional en el archivo.

Además: una vez dividido, cualquier IDE decente (como IntelliJ IDEA o cualquier otro) le dará la funcionalidad de búsqueda sobre el texto de vuelta.

[Cuidado: Esto viene de un programador por lo que podría no ser tu enfoque o ser exagerado, sólo puedo decir que al final FUNCIONARÍA, tú tendrás que saber si vale la pena]

11voto

Jcubed Puntos 2972
  1. Utilice less en una ventana de terminal. Te mostrará una página a la vez del archivo, sólo cargará esa cantidad en la memoria, así que puedes navegar por archivos de varios TB con él si quieres.

    Probablemente debería añadir el -n para evitar less de intentar calcular los números de las líneas. Así que:

    less -n /path/to/file

    Recuerda que puedes escribir less -n (no olvides el espacio final) y arrastra y suelta el archivo desde el Finder a la ventana del Terminal para añadir la ruta a ese archivo.

  2. Una vez que esté viendo el archivo en less puedes hacerlo:

    • navegar con las flechas arriba/abajo, space (una página más abajo), b (una página atrás)...
    • búsqueda mediante / . También puede buscar líneas que no contengan un patrón con /! . La búsqueda inversa utiliza ? . Pero todas las búsquedas escanean el archivo completo. Mejor tenerlo en un SSD si lo haces mucho.
    • navegar a una línea específica en el archivo usando <número> seguido de G (G mayúscula)
    • navegar a una parte específica del archivo usando <número> seguido de % . Así que 50% te llevará a la mitad del archivo, 90% hasta el último 10%, etc.

Si su archivo de registro tiene marcas de tiempo y usted sabe cuándo quiere mirar, el enfoque más rápido es:

  1. abrir el archivo
  2. Utilice una "búsqueda binaria" para encontrar la parte aproximada del archivo que le interesa:

    • Tipo 50% que le mostrará la mitad del archivo
    • Si la parte que desea es posterior, vaya a 75% Si no es así 25%
    • Repita la operación hasta que se haya limitado a la parte pertinente
  3. Utilice una búsqueda regular (con / para avanzar o ? para ir hacia atrás) para encontrar la línea exacta que buscas (basándote en la marca de tiempo exacta o en una palabra específica que sepas que muestra el problema).

Esto debería permitirle navegar rápidamente a la parte pertinente del archivo.


Si cree que va a realizar muchas búsquedas dentro de un subconjunto del archivo, puede utilizar alternativamente grep con una combinación específica de fecha o fecha-hora (en el formato correcto) para extraer primero ese subconjunto a otro archivo más pequeño. Por ejemplo, si sabe que el fallo se ha producido hoy un poco después del mediodía mientras que su registro abarca meses, podría

grep '2020-02-17 12:' /path/to/file > extracted-log.txt

Esto le dará todas las líneas que contengan una marca de tiempo entre las 12:00:00 y las 12:59:59 inclusive. Por supuesto, el formato exacto dependerá del formato real utilizado para las marcas de tiempo.

grep escaneará todo el archivo una vez para encontrar todas las líneas relevantes, lo que llevará un poco de tiempo en un archivo muy grande, pero entonces tendrás un archivo mucho más manejable.


Una alternativa puede ser utilizar dd para "extraer" una parte del archivo original, utilizando los desplazamientos y las longitudes encontradas en less ( Ctrl-G para obtener el desplazamiento actual). dd es una herramienta muy poderosa pero puede ser muy peligrosa de usar, así que úsela con precaución (y definitivamente no como root o con sudo si no estás 100% seguro de lo que estás haciendo):

dd if=/path/to/original/file of=destination_file.txt bs=1 skip=<start offset> count=<length>

Tenga en cuenta que esto no es muy eficiente, es mejor utilizar un tamaño de bloque mayor ( bs ), idealmente una potencia de 2 como 1024, y dividir skip y count por ese tamaño de bloque.

Estoy seguro de que debe haber otras herramientas que hagan lo mismo, aunque estoy en blanco. Creo que algunas versiones de cat puede hacerlo, pero no el de MacOS aparentemente.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X