Вопрос

На рабочем столе Linux (RHEL4) я хочу извлечь диапазон байтов (обычно меньше 1000) из большого файла (> 1 гигабайт). Я знаю смещение в файле и размер фрагмента.

Я могу написать код для этого, но есть ли решение для командной строки?

В идеале, что-то вроде:

magicprogram --offset 102567 --size 253 < input.binary > output.binary
Это было полезно?

Решение

Попробуйте dd :

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

Другие советы

Это старый вопрос, но я хотел бы добавить другую версию команды dd , которая лучше подходит для больших кусков байтов:

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

где $ offset и $ bytes являются числами в байтовых единицах.

Разница с принятым ответом Томаса заключается в том, что bs = 1 здесь не появляется. bs = 1 создает размер блока ввода и вывода равным 1 байту, что делает его ужасно медленным, когда количество извлекаемых байтов велико.

Команда dd может сделать все это. Посмотрите на параметры поиска и / или пропуска как часть вызова.

head + tail

Не уверен, насколько он эффективен по сравнению с dd , но это весело:

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

выбирает 3 байта, начиная со второго:

234

См. также: https://stackoverflow.com/a/1272995/895245

Еще быстрее

dd bs=<req len> count=1 skip=<req offset> if=input.binary of=output.binary 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top