Как извлечь один кусок байтов из файла? - PullRequest
57 голосов
/ 14 сентября 2009

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

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

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

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

Ответы [ 5 ]

90 голосов
/ 14 сентября 2009

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

dd skip=102567 count=253 if=input.binary of=output.binary bs=1
29 голосов
/ 24 ноября 2016

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

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

, где $offset и $bytes - числа в байтах.

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

3 голосов

head + tail

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

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

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

234

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

3 голосов
/ 14 сентября 2009

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

1 голос
/ 06 июня 2019

Еще быстрее

dd bs=<req len> count=1 skip=<req offset> if=input.binary of=output.binary 
...