Я боролся с выключением и включением "grep -Po" пару часов.
Я хотел бы узнать, сколько байтов соответствует размеру виртуального диска, как сообщает qemu-img info.
Вот пример вывода:
$ qemu-img info 022eb199-954d-4c78-8550-0ea1d31111ec
image: 022eb199-954d-4c78-8550-0ea1d31111ec
file format: qcow2
virtual size: 40G (42949672960 bytes)
disk size: 20G
cluster_size: 65536
И вот какие варианты я пробовал:
$ qemu-img info 022eb199-954d-4c78-8550-0ea1d31111ec | grep -Po '\(([0-9]+).*\)'
(42949672960 bytes)
Но мне просто нужен номер. Полагаю, я борюсь с тем, как сказать «grep -Po», какую часть регулярного выражения я хочу извлечь. Я думал, что скобки "(" сделают это.
Любая помощь будет принята с благодарностью. :)
Вы можете использовать разрез дважды, например:
echo "virtual size: 40G (42949672960 bytes)"| cut -f 4 -d" "| cut -c 2-
Первый резать cuts (42949672960, -f4 четвертое поле, -d "" - разделитель. Второе резать отрезает 42949672960 -c2- (от второго символа до конца.
qemu-img ... | grep -Po '[0-9]+(?= bytes)'
Это использует просмотр вперед с нулевой длиной утверждение, что будет соответствовать bytes
текст, но не будет включать его в вывод (потому что -o
был дан вариант).
Такие утверждения доступны, когда -P
переключиться на grep
используется (что указывает на использование perl
/pcre
-подобные регулярные выражения). Обе -P
и -o
уже использовались в вопросе OP и в заголовке.
echo "virtual size: 40G (42949672960 bytes)" | grep -Po '(?<=\()[^ ]*'
Матч слева (справа совпадает с пробелом
echo "virtual size: 40G (42949672960 bytes)" |grep -oP 'virtual.*\K(?<=\()[^ ]*'
Или более строгое сопоставление, чтобы начать с текста, начинающегося с виртуального
echo "виртуальный размер: 40 ГБ (42949672960 байт)" | grep -Po '(\ K ([^ \ s] +)'