第二次之后 grep 内容,排除最后两个单词/列

第二次之后 grep 内容,排除最后两个单词/列

我正在运行这个命令:

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 DirectoryVM-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$,并用任何东西替换整行

相关内容