Quiero localizar una fecha que esté en algún lugar de un registro de 8 GB (texto).
¿Puedo pasar por alto una lectura secuencial completa, y primero hacer divisiones binarias del archivo (tamaño), o navegar de alguna manera por el sistema de archivos inodes
(del cual sé muy poco), para comenzar a leer desde cada punto dividido, hasta encontrar un desplazamiento adecuado de ¿Dónde comenzar mi búsqueda de texto para una línea que incluya la fecha?
tail
La lectura de la última línea no usa una lectura secuencial normal, por lo que me pregunto si esta instalación está disponible de alguna manera en bash, o si necesitaría usar Python o C / C ++ ... pero estoy específicamente interesado en una bash
opción ..
bash
filesystems
text-processing
Peter.O
fuente
fuente
Respuestas:
que ... no crea archivos divididos en temp, omite bloques * 512 MB de datos en cada ejecución, lee 64 bytes desde esa posición y limita la salida a la primera línea de esos 64 bytes.
es posible que desee ajustar 64 a lo que crea que necesita.
fuente
dd
para eso ... ¡Es una gran herramienta! :)Suena como si quisieras:
o cualquier número de bytes que quieras omitir. El signo más le dice a tail que mida desde el inicio del archivo en lugar del final. Si está utilizando la versión GNU de tail, puede escribir eso como:
Para obtener un número fijo de bytes después del corte, en lugar de todo el resto del archivo, solo pásalo por la cabeza:
fuente
dd
salta a un byte específico (como lo hacetail
), pero es un dolor que codifica alrededor de longitudes de línea desconocidas, y luego una llamada a sed para quitar las líneas parciales iniciales ... Parece que la cola | cabeza puede hacer eso sin dolor (¿tan rápido?) . No entiendo cómo la cabeza puede cerrar el grifo en la cola, pero parece :) Debe ser un caso de: Si la cabeza deja de recibir, la cola deja de enviar (y deja de leer más). Debo ir ... volver mañana.tail
/head
tampoco puedo adivinar a ciegas las longitudes de línea. tienes que saltar a la posición x y luego puedes mirar hacia la izquierda o la derecha de x para la siguiente\n
. no importa cómo se llame el programa. entonces, en ambos casos saltas a x y luego usashead
para mirar a la derecha para el siguiente final de línea.tail|head
ofrece la capacidad de no preocuparse en absoluto pordd
la cuenta = val. Con 'dd', si no obtengo suficientes datos, se acabó el juego. La flexibilidad de las longitudes de línea arbitrarias es excelente. He escrito una función para 'dd' que devuelve la línea completa "siguiente más cercana" y su desplazamiento, pero preferiría evitar el problema de la longitud. Ahora he probado tail | head, e inicialmente funciona bien (para compensar = 100 MB), pero se ralentiza drásticamente para tomar 2 minutos para un acceso con desplazamiento = 8 GB (puedoawk
hacerlo en 1 minuto) ... así que es genial para archivos más pequeños ... Gracias porIntentaría algo como esto para dividir el registro en fragmentos de 512MiB para un análisis más rápido.
Si está buscando el archivo, lo siguiente funcionaría:
Use esa salida para determinar qué archivo grep para su fecha.
fuente
Aquí está mi script, estoy buscando la primera línea donde el primer campo coincide con mi número. Las líneas se ordenan según el primer campo. Utilizo dd para verificar la primera línea de bloques de 128K, luego salto al bloque y realizo una búsqueda. Mejora la eficiencia si el archivo supera los 1M.
Cualquier comentario o corrección es apreciado!
* EDITAR * ** grep es mucho más rápido y ACK aún mejor
fuente