¿Grep en un archivo de registro enorme (> 14 GB) solo los últimos x GB?


34

Necesito buscar algo en un archivo de registro enorme (más de 14 GB). Estoy bastante seguro de que está en los últimos 4 GB más o menos.

¿Hay alguna forma de saltear el primer X GB para acelerar las cosas?


77
LC_ALL=C greppuede acelerarlo.
jfs el

1
Podrá obtener mucha velocidad eligiendo una grepexpresión sensata ... los comodines de longitud desconocida (como a.*thing) en algunos casos tomarán mucho más tiempo para evaluar. Puede ser que esté optimizando para lo incorrecto (aunque obviamente no está de más buscar solo una parte del archivo, obviamente, puede que no sea la mayor fuente de aceleración).
Floris

Respuestas:


75

Supongo que podría usar la cola para generar solo los últimos 4 GB utilizando el -cinterruptor

-c, --bytes = [+] NUM genera
los últimos NUM bytes; o use -c + NUM para la salida comenzando con el byte NUM de cada archivo

Probablemente también podría hacer algo con dd estableciendo bs=1e skiping en el desplazamiento que desea comenzar, por ejemplo

dd if=file bs=1024k skip=12g | grep something

83
Luego, debe configurar logrotate.
Gerald Schneider

3
@Rogier Agregue una respuesta con la solución en lugar de agregarla en su pregunta. Esto es similar a la respuesta automática
AL

55
@istheEnglishway: Bueno, no, publicaron un comando diferente.
Lightness compite con Mónica el

11
Pero su respuesta no proporciona el comando real que implementa esa solución, que es un valor agregado. Puede editar eso en su respuesta, o el OP podría publicarlo como una nueva respuesta. Definitivamente no deberían agregarlo a la pregunta, que es lo que sucedió. Y definitivamente no deberías arrojar epítetos como "meter la nariz".
Lightness compite con Mónica el

77
@istheEnglishway, lo creas o no, tener un ejemplo hace las cosas más fáciles que tener que leer una página de manual (ver también: documentación de stackoverflow)
Pierre.Sassoulas

32

Solo estoy publicando esto porque algunos de los comentarios lo solicitaron.

Lo que terminé usando fue (archivo de 15 GB). Funcionó muy rápido y me ahorró un montón de tiempo.

tail -f -c 14G file | grep something

También hice un punto de referencia muy rudimentario en el mismo archivo. Probé:

grep xxx file
// tomó para siempre (> 5 minutos)

dd if = archivo bs = 1 skip = 14G | grep xxx
// muy rápido <1 seg

cola -c 14g | grep xxx
// bastante rápido <2 segundos

El tailes un poco más corto.

NB: el sufijo utilizado gy Gdifiere según el comando (Ubuntu 15.10)


¿Borraste el caché del disco entre los puntos de referencia? Sospecho que la mayor parte del tiempo en el primero fue E / S. La aceleración debe ser del orden de 15 ×, no 300 ×.
Reid

2
@Reid no lo hice. Pero ejecuté cada comando varias veces. Estoy bastante seguro de que dd o tail aumentarán la velocidad significativamente por encima de grep (caché o no).
Roger

19

Esto no responde a la pregunta del Título, pero hará lo que quieras hacer. Use tac para revertir el archivo, luego use grep para encontrar su cadena. Si su cadena solo aparece una vez o una cantidad conocida de veces en el archivo, déjela ejecutar hasta que encuentre la cantidad conocida de ocurrencias. De esa manera, si su suposición acerca de dónde está en el archivo es incorrecta, todavía la encontrará. Si quieres limitarlo, puedes usar head para hacerlo. El comando principal iría entre el tac y el grep.

Entonces el comando se ve así:

tac < logfile | grep myString

1
Vine aquí para escribir exactamente la misma respuesta. Me sorprende que nadie haya votado por el tuyo.
Dmitry Grigoryev

2
Me tomó un minuto, pero luego gruñí por el juego de palabras ... tac es lo contrario de gato.
Sammi

1
Necesitaba buscar en un registro de aplicación / depuración . Debido a que invierte las líneas, no es más fácil de leer ;-) Sin embargo, parece muy rápido. Nunca visto tac, así que gracias!
Roger
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.