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
@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.
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!
LC_ALL=C grep
puede acelerarlo.grep
expresión sensata ... los comodines de longitud desconocida (comoa.*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).Respuestas:
Supongo que podría usar la cola para generar solo los últimos 4 GB utilizando el
-c
interruptorProbablemente también podría hacer algo con dd estableciendo
bs=1
eskip
ing en el desplazamiento que desea comenzar, por ejemplofuente
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.
También hice un punto de referencia muy rudimentario en el mismo archivo. Probé:
El
tail
es un poco más corto.NB: el sufijo utilizado
g
yG
difiere según el comando (Ubuntu 15.10)fuente
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í:
fuente
tac
, así que gracias!