2009-09-14 41 views
37

Linux masaüstünde (RHEL4), büyük bir dosyadan (> 1 Gig) bir dizi bayt (genellikle 1000'den az) ayıklamak istiyorum. Dosyaya ve öbek büyüklüğüne ofset biliyorum.Dosyadaki tek bir baytlık bayttan nasıl çıkarılır?

Bunu yapmak kod yazabilir ama bir komut satırı çözümü vardır?

İdeal olarak, bir şey gibi:

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

cevap

62

dd deneyin:

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

Teşekkürler. Tam olarak ne istediğimi. – DanM

+2

İsteğe bağlı olarak stderr'e çıktılamayı bastırmak için 'status = none 'değerini ekleyin. – kenorb

+4

Aşağıda, hex offset'leri kullanılarak örnek verilmiştir: 'dd if = in.bin bs = 1 status = none skip = $ ((0x88)) count = $ ((0x80)) = = out.bin'. – kenorb

3

dd komutu tüm bu yapabilirsiniz. Aramanın bir parçası olarak arama ve/veya atlama parametrelerine bakın.

10

Bu eski bir sorudur ama bayt büyük boyutta için daha iyi uygundur dd komutun başka bir sürümünü eklemek istiyorum:

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

$offset ve $bytes bayt birimlerinde sayılardır .

Thomas'ın kabul cevap fark bs=1 burada görünmüyor olmasıdır. bs=1, giriş ve çıkış bloğu boyutunu 1 bayt olacak şekilde üretir; bu da, çıkarılacak bayt sayısı büyük olduğunda çok yavaşlatır.

1

head +

o verimliliğinde dd karşılaştırmak, ama eğlenceli ne kadar emin değil tail:

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

seçer 3 byte, 2 birinde başlayan:

234 

Ayrıca bkz: https://stackoverflow.com/a/1272995/895245

İlgili konular