Назад | Перейти на главную страницу

Команда Linux для получения диапазона байтов из файла

я знаю это head и tail может взять -c опция для указания байтового смещения. Я ищу способ эффективно извлечь диапазон байтов из большого файла журнала.

DareDevil команд Unix, dd для спасения!

dd if=yourfile ibs=1 skip=200 count=100

Это начнется с байта 200 и покажет 100 следующих байтов, или, другими словами, байты 200-300. ibs означает, что dd читает только один байт за раз вместо 512 байтов по умолчанию, но по-прежнему записывает блоки по 512 байт. Пойдите и посмотрите, если ibs вредит производительности, надеюсь, нет.

Если вас интересуют байты, od быть более интересным.

-j, --skip-bytes=bytes
-N, --read-bytes=bytes

Итак, чтобы прочитать 16 байтов, начиная с байта 1024, и вывести в формате ascii

od -j 1024 -N 16 -a /bin/sh

Ты можешь использовать dd if=logfile of=pieceoflogfile skip=startingblock count=#ofblocks (возможно, с bs=1 для получения однобайтовых блоков, в противном случае используются блоки по 512 байт). Однако не уверен, насколько эффективно указывать ему писать по одному байту за раз.

Предполагая, что файл не слишком велик (например, несколько ГБ или около того), переход от одного к другому будет настолько эффективным, насколько это возможно, если не считать написания для этого собственной программы.

head ... file | tail ...

(Или наоборот. Как бы то ни было.)

Я знаю, что это старая версия, и в заголовке просили ввести команду «linux», но python идеально подходит для этого и входит в состав большинства дистрибутивов Linux. Это так просто:

python -c 'f=open("myfile.txt","rb");f.seek(100);print(f.read(100));f.close()' | SomeOtherProgram

f.seek(n,0) проходит n байтов от начала программы, и f.read(n) читает желаемое количество байтов.

Я не нашел других вариантов, которые бы упрощали эту задачу.