я знаю это 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)
читает желаемое количество байтов.
Я не нашел других вариантов, которые бы упрощали эту задачу.