Назад | Перейти на главную страницу

Использование grep -Po для извлечения регулярного выражения

Я боролся с выключением и включением "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] +)'