Это работа не для grep, а для лучшего инструмента, такого как awk.
Простой обходной путь — использовать gnu awk с настраиваемым разделителем записей RS, например Section
.
Использование слова «Раздел» для разделения строк, все, что находится между словами Section 1
и Section 2
, будет рассматриваться как одна строка для awk.
То же для Раздела 2 -Раздела 3 и т. д.
Теперь вам нужно только напечатать правильную «строку» = «строку», содержащую interesting-pattern
.
$ awk -v RS="# Section " '/interesting-pattern/{print RT $0}' file1
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text
###############
Поскольку gnu awk может принимать регулярные выражения в RS (Разделитель записей ), вы также можете применить что-то более сложное в RS, например:
$ awk -v RS="###############\n# Section " '/interesting-pattern/{print RT $0}'
###############
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text
PS:{print RT
указывает awk напечатать текущий разделитель записей
Если кто-то сталкивался с этим и имел ту же проблему, решение, которое сработало для меня, в основном такое, как описано выше. В приведенном ниже примере мой исходный диск имеет 2 раздела, загрузочный раздел и раздел данных с 2 логическими томами, а целевой диск начинается с загрузочного раздела и раздела данных без логических томов.
sudo e2fsck -f /dev/mapper/ubuntu--1704--base--vg-root
-имя тома можно найти в выводеsudo fdisk -l
sudo resize2fs -M /dev/mapper/ubuntu--1704--base--vg-root
sudo lvreduce --resizefs -L 28.5G /dev/mapper/ubuntu--1704--base--vg-root
sudo vgrename ubuntu-1704-base-vg ubuntu-1704-base-vg-2
sudo pvcreate /dev/sda2
sudo vgcreate ubuntu-1704-base-vg /dev/sda2
sudo lvdisplay
, а затем использовал их в качестве входных данных для команды lvcreate, например. :sudo lvcreate --extents 7296 --stripes 1 --name root ubuntu-1704-base-vg
sudo lvcreate --extents 255 --stripes 1 --name swap_1 ubuntu-1704-base-vg
sudo dd if=/dev/sdb1 of=/dev/sda1 bs=64M status=progress
sudo dd if=/dev/mapper/ubuntu--1704--base--vg--2-root of=/dev/mapper/ubuntu--1704--base--vg-root bs=64M status=progress
Наконец, запустите проверку файловой системы, чтобы убедиться, что диски в порядке. Могут быть ошибки, которые необходимо исправить, хотя после этого я смог успешно загрузиться со скопированного диска, и содержимое было таким, как ожидалось.sudo e2fsck -f /dev/mapper/ubuntu--1704--base--vg-root
Используемые ссылки :https://blog.shadypixel.com/how-to-shrink-an-lvm-volume-safely/https://docs.microsoft.com/en-us/azure/virtual-machines/linux/configure-lvm
Насколько я понимаю, на самом деле вам нужно скопировать образ виртуальной машины в образ меньшего размера, но по-прежнему использовать это в Hyper -V (, поэтому используйте формат VHDX ).
В таком случае не вижу смысла проходить новую виртуальную машину.
Образы дисков ВМ можно создавать как с фиксированным, так и с динамическим размером. При использовании фиксированного размера все пространство выделяется при создании образа, и образ виртуальной машины фактически использует окончательный размер. При использовании динамического формата объем дискового пространства увеличивается только по мере фактического использования диска в виртуальной машине.
Таким образом, вы должны сначала проверить, какой формат на самом деле используется :ваш файл изображения может предоставлять 50 Гб, фактически используя меньше разреженных файлов, (если поддерживается вашей ОС ).
Если ваше изображение является фиксированным, вам следует поискать конвертер (, например. Конвертер StarWind V2V или другой )для создания нового динамического образа из вашего фиксированного, без необходимости проходить через LVM или изменения разделов.
Примечание. :Для этого может потребоваться сначала очистить все неиспользуемое пространство в каждой файловой системе виртуальной машины Ubuntu (dd if=/dev/zero of=/zerofile ; rm -f /zerofile ).