awk
весьма ограничены. gawk
имеет gensub ()
, который может, по крайней мере, включать части согласованной части в замену, но с ними нельзя выполнять операции.
Это возможно с awk
, но вам нужно использовать другой подход:
awk '{
text = $0
$0 = ""
while (match(text, /[0-9]+/)) {
$0 = $0 substr(text, 1, RSTART-1) \
(substr(text, RSTART, RLENGTH) - 1)
text = substr(text, RSTART+RLENGTH)
}
$0 = $0 text
print}'
Или с GNU awk
в качестве варианта подхода @ jofel:
gawk -v 'RS=[0-9]+' '{printf "%s", $0 (RT==""?"":RT-1)}'
или
gawk -v 'RS=[^0-9]+' '{printf "%s",($0==""?"":$0 - 1)RT}'
] Однако с perl
здесь все намного проще:
perl -pe 's/\d+/$&-1/ge'
perl
может использовать группы захвата (например, $ 1
, $ 2
... и $ &
для всей согласованной части) и с флагом e
может запускать с ними произвольные выражения perl
.
Я не думаю, что есть способ пропустить запуск LVM в госте и просто lvextend на хосте, а затем resize2fs в госте?
Нет абсолютно никакого требования использовать LVM в госте. Вы можете просто использовать блочное устройство напрямую. Использование LVM внутри гостя почти ничего не дает (поскольку вы уже используете LVM на хосте для управления своим пространством).
Если под "KVM" вы подразумеваете "libvirt", вы можете использовать команду virsh blockresize
, чтобы заставить вашего гостя распознать дополнительное пространство после изменения размера блочного устройства. То есть, если у меня есть гость с подключенным LV:
</disk><disk type="block" device="disk">
<driver name="qemu" type="raw"/>
<source dev="/dev/tank/foobar"/>
<backingStore/>
<target dev="vdb" bus="virtio"/>
<alias name="virtio-disk1"/></disk>
Где:
# lvs
foobar tank -wi-ao---- 4.00g
Я могу добавить место на LV на хосте:
# lvresize -L +2G /dev/tank/foobar
Скажите libvirt обновить размер:
# virsh blockresize myguest /dev/tank/foobar --size 0
А затем внутри гостя измените размер файлового хранилища:
guest# resize2fs 1.42.12 (29-Aug-2014)
Resizing the filesystem on /dev/vdb to 1572864 (4k) blocks.
The filesystem on /dev/vdb is now 1572864 (4k) blocks long.