На рабочем столе Linux (RHEL4) я хочу извлечь диапазон байтов (обычно менее 1000) из большого файла (> 1 ГБ). Я знаю смещение в файле и размер куска.
Я могу написать для этого код, но есть ли решение для командной строки?
В идеале что-то вроде:
magicprogram --offset 102567 --size 253 < input.binary > output.binary
status=none
чтобы подавить вывод в stderr.dd if=in.bin bs=1 status=none skip=$((0x88)) count=$((0x80)) of=out.bin
.Это старый вопрос, но я хотел бы добавить еще одну версию
dd
команды, которая лучше подходит для больших блоков байтов:где
$offset
и$bytes
- числа в байтовых единицах.Разница с принятым ответом Томаса заключается в том,
bs=1
что здесь его нет.bs=1
производит размер входного и выходного блока равным 1 байту, что делает его ужасно медленным, когда количество байтов для извлечения велико.источник
iflag
это неизвестный операнд, и без него вы получите целый блок.dd
можно использовать дляiflag
поддержки (brew install coreutils
). Примечание: по умолчанию утилиты устанавливаются сg
префиксом (например,gdd
вместоdd
)head -c
+tail -c
Не уверен, как это сравнить по
dd
эффективности, но это весело:выбирает 3 байта, начиная со второго:
См. Также: https://stackoverflow.com/a/1272995/895245
источник
printf '\x01\x02' > f
иhd
.Все это может делать команда dd. Посмотрите на параметры поиска и / или пропуска как часть вызова.
источник
Даже быстрее
источник
skip
это единицыbs
.req_offset=$(bc <<< "$offset/$bs")
и убедиться, что получается круглое значение.