2009-09-14 16 views
37

Su un desktop Linux (RHEL4) Voglio estrarre un intervallo di byte (in genere inferiore a 1000) da un file di grandi dimensioni (> 1 Gig). Conosco l'offset nel file e la dimensione del blocco.Come estrarre un singolo blocco di byte da un file?

Posso scrivere codice per farlo ma esiste una soluzione da riga di comando?

Idealmente, qualcosa di simile:

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

risposta

62

Prova dd:

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

Grazie. Esattamente quello che volevo. – DanM

+2

Aggiungere facoltativamente 'status = none' per sopprimere l'output su stderr. – kenorb

+4

Ecco un esempio di offset esadecimale: 'dd if = in.bin bs = 1 stato = nessuno skip = $ ((0x88)) conteggio = $ ((0x80)) di = out.bin'. – kenorb

3

Il dd può fare tutto questo. Guarda i parametri seek e/o skip come parte della chiamata.

10

Questa è una vecchia questione, ma vorrei aggiungere un'altra versione del comando dd che è meglio adatto per grandi blocchi di byte:

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

dove $offset e $bytes sono numeri in unità di byte .

La differenza con la risposta accettata di Thomas è che bs=1 non viene visualizzato qui. bs=1 produce la dimensione del blocco di input e output per essere 1 byte, il che rende terribilmente lento quando il numero di byte da estrarre è ampio.

1

head + tail

Non sono sicuro di come si confronta con dd in termini di efficienza, ma è divertente:

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

picconi 3 byte, a partire dalla 2 ° uno:

234 

Vedi anche: https://stackoverflow.com/a/1272995/895245

Problemi correlati