2009-09-14 12 views
37

Na pulpicie systemu Linux (RHEL4) chcę wyodrębnić zakres bajtów (zwykle mniej niż 1000) z dużego pliku (> 1 gig). Znam przesunięcie do pliku i wielkość porcji.Jak wyodrębnić pojedynczy fragment bajtów z pliku?

Potrafię napisać kod, aby to zrobić, ale czy istnieje rozwiązanie z linii poleceń?

Idealnie, coś jak:

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

Odpowiedz

62

Spróbuj dd:

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

Dzięki. Dokładnie to, czego chciałem. – DanM

+2

Opcjonalnie dodaj 'status = none', aby pominąć wyprowadzanie na stderr. – kenorb

+4

Oto przykład użycia przesunięć heksadecymalnych: 'dd if = in.bin bs = 1 status = none skip = $ ((0x88)) count = $ ((0x80)) of = out.bin'. – kenorb

3

DD może zrobić wszystko. Sprawdź parametry wyszukiwania i/lub pominięcia w ramach połączenia.

10

Jest to stary pytanie, ale chciałbym dodać kolejną wersję komendy dd że jest lepiej przystosowane do dużych kawałków bajtów:

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

gdzie $offset i $bytes są liczbami w jednostkach bajtowych .

Różnica w stosunku do zaakceptowanej przez Thomasa odpowiedzi brzmi: bs=1 nie pojawia się tutaj. bs=1 tworzy rozmiar bloku wejściowego i wyjściowego jako 1 bajt, co powoduje, że jest on strasznie wolny, gdy liczba bajtów do wyodrębnienia jest duża.

1

head + tail

Nie wiem, jak to porównać do dd wydajności, ale to jest zabawa:

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

rozgrywki 3 bajty, począwszy od 2 jeden:

234 

Zobacz też: https://stackoverflow.com/a/1272995/895245

Powiązane problemy