我正在运行这个命令:
mccli group show-members --name=/$vcenter_name/VirtualMachines/$i | tail -n +4
输出为:
/vcenter-prod.happycow.local/VirtualMachines/Backup With Space Normal /vcenter-prod.happycow.local/VirtualMachines/Active Directory Virtual Machine
/vcenter-prod.happycow.local/VirtualMachines/Backup With Space Normal /vcenter-prod.happycow.local/VirtualMachines/VM-Replicate Virtual Machine
我想从这个输出中提取的Active Directory
是VM-Replicate
请注意,此输出可能因环境而异,并且我们可能会在必填字段中留出更多空格,例如:
New Virtual Machine
Another New Virtual Machine
NoSpaceHere
所以我的想法是 grep 特定字符串的第二个实例VirtualMachines
,因为VirtualMachines
它也出现在行的开头。
然后,一旦第二个VirtualMachines
匹配,仅在该行中打印该匹配之后的所有内容,但排除最后两列,Virtual
因为Machine
这始终是恒定的。
但无法弄清楚这个语法。有什么建议吗?
答案1
由于 GNU grep 具有 PCRE 模式,因此获取匹配后内容的最简单方法可能是使用 perl\K
修饰符(例如)贪婪地匹配所有内容直到最后/
并丢弃它:
$ cat output | grep -Po '.*/\K.*'
Active Directory Virtual Machine
VM-Replicate Virtual Machine
要删除尾部,您可以添加显式展望:
$ cat output | grep -Po '.*/\K.*(?=Virtual Machine)'
Active Directory
VM-Replicate
答案2
这是我sed
针对您的输出的解决方案:
$ ... | sed -r 's:.*/(.*)Virtual Machine$:\1:'
Active Directory
VM-Replicate
笔记:
.*/
从头到尾查看/
:/vcenter-prod.happycow.local/VirtualMachines/Backup With Space Normal /vcenter-prod.happycow.local/VirtualMachines/
Virtual Machine
然后我们在使用之前寻找任何东西(.*)Virtual Machine$
,并用任何东西替换整行