![使用 grep -Po 提取正则表达式](https://linux22.com/image/802019/%E4%BD%BF%E7%94%A8%20grep%20-Po%20%E6%8F%90%E5%8F%96%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.png)
我已经断断续续地为“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]+)'