2009-09-14 28 views
37

En un escritorio Linux (RHEL4) quiero extraer un rango de bytes (generalmente menos de 1000) dentro de un archivo grande (> 1 Gig). Sé el desplazamiento en el archivo y el tamaño del fragmento.¿Cómo extraigo un solo fragmento de bytes de un archivo?

Puedo escribir código para hacer esto pero ¿hay una solución de línea de comando?

Idealmente, algo así como:

magicprogram --offset 102567 --size 253 <input.binary> output.binary 

Respuesta

62

Trate dd:

comando
dd skip=102567 count=253 if=input.binary of=output.binary bs=1 
+0

Gracias. Exactamente lo que quería. – DanM

+2

Opcionalmente agregue 'status = none' para suprimir la salida a stderr. – kenorb

+4

Aquí está el ejemplo usando las compensaciones hexadecimales: 'dd if = in.bin bs = 1 estado = ninguna omisión = $ ((0x88)) count = $ ((0x80)) of = out.bin'. – kenorb

3

El dd puede hacer todo esto. Mire los parámetros de búsqueda u omisión como parte de la llamada.

10

Ésta es una vieja pregunta, pero me gustaría añadir otra versión del comando dd que está adaptado mejor para grandes trozos de bytes:

dd if=input.binary of=output.binary skip=$offset count=$bytes iflag=skip_bytes,count_bytes 

donde $offset$bytes y son números en unidades de byte .

La diferencia con la respuesta aceptada por Thomas es que bs=1 no aparece aquí. bs=1 produce el tamaño del bloque de entrada y salida para que sea de 1 byte, lo que lo hace terriblemente lento cuando el número de bytes para extraer es grande.

1

head + tail

No estoy seguro de cómo se compara con dd en la eficiencia, pero es divertido:

printf "123456789" | tail -c+2 | head -c3 

selecciones de 3 bytes, comenzando en el segundo uno:

234 

Véase también: https://stackoverflow.com/a/1272995/895245

Cuestiones relacionadas