¿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?

Roger
fuente
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
user9517 es compatible con GoFundMonica
fuente
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)

Roger
fuente
¿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
Itsme2003
fuente
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