В качестве альтернативы вы можете использовать хороший инструмент под названием kpartx
. Из man-страницы:
kpartx - Создание карт устройств из таблиц разделов
Это означает, что вы можете создать "псевдоустройство" с разделами устройств прямо из файла img:
$ kpartx -av sdb.img
add map loop0p1 (254:2): 0 2048 linear /dev/loop0 0
add map loop0p2 (254:3): 0 31162 linear /dev/loop0 2048
$ lsblk
.
.
.
loop0 7:0 0 16.2M 0 loop
├─loop0p1 254:2 0 1M 0 part
└─loop0p2 254:3 0 15.2M 0 part
Затем вы можете смонтировать /dev/mapper/loop0p2
, например, если вам нужен второй раздел образа.
С gnu split
:
n=2
m=4
split -l ${m} --filter="head -n ${n}" infile
и если вы хотите сделать это только после i
-й строки, просто перенаправьте предыдущие строки на / dev / null
:
n=2
m=4
i=7
{ head -n ${i} >/dev/null; split -l ${m} --filter="head -n ${n}"; } <infile
Если у вас нет доступа к инструментам gnu
, вы можете использовать awk
:
awk -vn=2 -vm=4 -vi=7 'NR<=i{next}; (NR-i)%m==1{c=1}; c++<=n' infile
Или это, gnu sed
:
sed -n -e '1~4 {N; p;}' file
-n
подавляет вывод. Если в строке 1 + 4 * k
(k = итератор) текущая строка и следующая строка считываются в пространство шаблонов
и p
печатает (текущую) пространство шаблонов (т.е. временное включение вывода)
Для GNU sed
sed '3~4,+1 d' file
или более общего:
m=4
n=2
sed "$((m-n+1))~$m,+$((m-n-1)) d" file
Вы можете использовать ~
в адресе в GNU sed:
sed -n '1~4p;2~4p'
который гласит: «Печатать первую строку каждые 4 строки и печатать вторую строку каждые 4 строки» или «Начиная со строки 1, печатать каждую 4-ю строку и начиная со строки. 2, выведите каждую 4-ю строку ».