使用 grep -Po 提取正则表达式

使用 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”我想要提取正则表达式的哪一部分。我以为“(”括号可以做到这一点。

任何帮助将不胜感激。 :)

答案1

您可以使用两次 cut,例如:

echo "virtual size: 40G (42949672960 bytes)"| cut -f 4 -d" "| cut -c 2-

第一的剪切(42949672960,-f4 第四字段,-d“ ”是分隔符。第二个剪切 42949672960 -c2- (从第二个字符剪切到末尾。

答案2

echo "virtual size: 40G (42949672960 bytes)" | grep -Po '(?<=\()[^ ]*'

左侧匹配(右侧匹配空格

echo "virtual size: 40G (42949672960 bytes)" |grep -oP 'virtual.*\K(?<=\()[^ ]*'

或者更严格的匹配,从以 virtual 开头的文本开始

答案3

qemu-img ... | grep -Po '[0-9]+(?= bytes)'

这是使用零长度前瞻断言,它将匹配bytes文本但不会将其包含在输出中(因为-o给出了选项)。

-P当使用switch to时grep(指示它使用perl/pcre类正则表达式),此类断言可用。-P-o都已在 OP 的问题和标题中使用。

答案4

echo“虚拟大小:40G(42949672960 字节)”| grep -Po'(\K([^\s]+)'

相关内容