En un escritorio Linux (RHEL4), quiero extraer un rango de bytes (generalmente menos de 1000) desde un archivo grande (> 1 Gig). Conozco el desplazamiento en el archivo y el tamaño del fragmento.
Puedo escribir código para hacer esto, pero ¿hay una solución de línea de comando?
Idealmente, algo como:
magicprogram --offset 102567 --size 253 < input.binary > output.binary
status=none
para suprimir la salida a stderr.dd if=in.bin bs=1 status=none skip=$((0x88)) count=$((0x80)) of=out.bin
.Esta es una pregunta antigua, pero me gustaría agregar otra versión del
dd
comando que sea más adecuada para grandes cantidades de bytes:donde
$offset
y$bytes
son números en unidades de bytes.La diferencia con la respuesta aceptada de Thomas es que
bs=1
no aparece aquí.bs=1
produce que el tamaño del bloque de entrada y salida sea de 1 byte, lo que lo hace terriblemente lento cuando la cantidad de bytes a extraer es grande.fuente
iflag
es un operando desconocido y sin él obtienes un bloque completo.dd
se puede utilizar comoiflag
soporte (brew install coreutils
). Nota: por defecto, las utilidades se instalan con ung
prefijo (por ejemplo, engdd
lugar dedd
)head -c
+tail -c
No estoy seguro de cómo se compara con la
dd
eficiencia, pero es divertido:elige 3 bytes, comenzando en el segundo:
Véase también: https://stackoverflow.com/a/1272995/895245
fuente
printf '\x01\x02' > f
yhd
.El comando dd puede hacer todo esto. Observe los parámetros de búsqueda y / o omisión como parte de la llamada.
fuente
Aun más rápido
fuente
skip
está en unidades debs
.req_offset=$(bc <<< "$offset/$bs")
y asegurarse de que resulte un valor redondo.