Lo sé head
y tail
puedo tomar la -c
opción de especificar un desplazamiento de bytes. Estoy buscando una manera de extraer eficientemente un rango de bytes de un archivo de registro grande.
Lo sé head
y tail
puedo tomar la -c
opción de especificar un desplazamiento de bytes. Estoy buscando una manera de extraer eficientemente un rango de bytes de un archivo de registro grande.
¡El DareDevil de los comandos de Unix, dd
al rescate!
dd if=yourfile ibs=1 skip=200 count=100
Eso comenzaría desde el byte 200 y mostraría 100 bytes siguientes, o en otras palabras, bytes 200-300. ibs
significa que dd solo lee un byte a la vez en lugar de los 512 bytes predeterminados, pero aún escribe en fragmentos de 512 bytes predeterminados. Ve a ver si ibs
perjudica el rendimiento, espero que no.
Si su interés está en los bytes, sería od
de mayor interés.
-j, --skip-bytes=bytes
-N, --read-bytes=bytes
Entonces, para leer los 16 bytes que comienzan en el byte 1024 y salen en ascii
od -j 1024 -N 16 -a /bin/sh
Puede usar dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks
(posiblemente con bs=1
para obtener bloques de un byte, de lo contrario, usa bloques de 512 bytes). Sin embargo, no estoy seguro de cuán eficiente es decirle que escriba un byte a la vez.
dd
's pueden ser de tubo en cadena (el primero podría cortar el pedazo de grasa y la segunda haría buen trabajo sobre el tubo, no de disco), pero dd
tiene no sólo bs
pero separado ibs
y obs
, así, por lo que en menos podría salir con bloques más grandes que la lectura.
Suponiendo que el archivo no es excesivamente grande (por ejemplo, varios GB o más), la canalización de uno a otro es tan eficiente como sea posible, salvo escribir su propio programa para hacerlo.
head ... file | tail ...
(O al revés. Lo que sea.)
time dd if=file.txt | wc -l
= 00: 00: 03s.time dd if=file.txt ibs=1 count=782090815 | wc -l
= 9:05:19