LINUX.ORG.RU

[shell] seek X bytes, read Y bytes


0

1

Есть ли годная утилита, желательно из coreutils или встроенная команда баша, которая может прочитать из файла несколько байт с определенной позиции?

Устроил бы dd, но он оперирует блоками и насколько я понял там невозможно нормально работать с байтами, кроме как установит ibs=1, но при этом чтение файла становится очень медленным, оно и понятно.

Несколько байт, которые вам нужно, прочитаются хоть как быстро, хоть bs=1, хоть bs=100. Просто смещение нужно задавать через skip= , тогда байты не будут считываться, а будет syscall lseek().

mky ★★★★★ ()
Ответ на: комментарий от mky

Несколько - не значит что их там мало. 10 мб уже совсем не быстро читаются.

Olegymous ★★ ()
Ответ на: комментарий от Olegymous

Хм, зря удалил свой комментарий. Например

dd if=blah-blah of=/dev/null ibs=1 skip=10 obs=1024

будет быстрее.

GotF ★★★★★ ()
Ответ на: комментарий от GotF

Но всего лишь раз в десять, что всё равно очень медленно.

GotF ★★★★★ ()
Ответ на: комментарий от GotF

Т.е. увеличение выходного буфера со стандартных 512 до 1024 ускорило операцию?

Olegymous ★★ ()

Нашёл более быстрое решение:

cat file | tail -c+$offset
GotF ★★★★★ ()
Ответ на: комментарий от Olegymous

Неа... Я напутал немного. В смысле, увеличивает, если опция была bs, т.е. и выход был 1 байт. Короче, смотри пост чуть выше (=

GotF ★★★★★ ()
Ответ на: комментарий от GotF

О, за tail спасибо, не заметил в мане `+' Похоже получается самый годный способ такой:

tail -c+$(($offset+1)) | head -c$bytes_to_read

Я правильно понимаю, что когда head закончит читать tail должен закончить писать?

Olegymous ★★ ()
Ответ на: комментарий от Olegymous

Я правильно понимаю, что когда head закончит читать tail должен закончить писать?

Затестил, заканчивает. Видимо SIGPIPE получает. Значит такое решение очень даже быстрое. Пропустил имя файла в предыдущем сообщении

tail -c+$(($offset+1)) "$filename" | head -c$bytes_to_read

Olegymous ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.