Если Вы хотите строки X к Y включительно (начинающий нумерацию в 1), использовать
tail -n "+$X" /path/to/file | head -n "$((Y-X+1))"
tail
считает и отбросит первые X-1 строки (нет никакого пути вокруг того), затем считайте и распечатайте следующие строки. head
считает и распечатает требуемое количество строк, затем выйдет. Когда head
выходы, tail
получает сигнал SIGPIPE и умирает, таким образом, он не будет читать больше, чем ценность размера буфера (обычно несколько килобайтов) строк из входного файла.
С другой стороны, как gorkypl предложенный, используйте sed:
sed -n -e "$X,$Y p" -e "$Y q" /path/to/file
sed решение значительно медленнее хотя (по крайней мере, для утилит GNU и утилит Busybox; sed мог бы быть более конкурентоспособным при извлечении значительной части файла на ОС, где передача по каналу является медленной, и sed быстр). Вот быстрые сравнительные тесты в соответствии с Linux; данные были сгенерированы seq 100000000 >/tmp/a
, среда является Linux/amd64, /tmp
tmpfs, и машина в других отношениях неактивна и не подкачивает.
real user sys command
0.47 0.32 0.12 /dev/null #GNU
7.12 6.58 0.55 /dev/null #BusyBox
9.95 9.54 0.28 sed -n -e '50000000,90000000 p' -e '90000000q' /tmp/a >/dev/null #GNU
23.76 23.13 0.31 sed -n -e '50000000,90000000 p' -e '90000000q' /tmp/a >/dev/null #BusyBox
Если Вы знаете диапазон байта, Вы хотите работать с, можно извлечь его быстрее путем пропуска непосредственно к позиции запуска. Но для строк, необходимо читать с начала и считать новые строки. Извлечь блоки из x включительно к y эксклюзивному запуску в 0, с размером блока b:
dd bs="$b" seek="$x" count="$((y-x))"
В самом минимальном случае просто загрузчик, ядро и файловая система.
Загрузчик иногда является частью встроенного микропрограммного обеспечения (недавние ядра Linux могут быть загружены непосредственно EFI на x86). Также необходимо сказать ядро что файловую систему смонтироваться как /
, например, с root=
параметр (для Linux). Это впоследствии попытается загрузить init как последний шаг к ручному управлению к пространству пользователя. В случае Linux Вы могли бы хотеть проверить init_post()
в init/main.c
для порядка двоичных файлов, которые пробуют.