O conteúdo de Grep após a segunda instância, exclui as duas últimas palavras / colunas

1

Estou executando este comando:

mccli group show-members --name=/$vcenter_name/VirtualMachines/$i | tail -n +4

A saída é:

/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

O que eu gostaria de extrair dessa saída é Active Directory e VM-Replicate

Observe que essa saída pode mudar de ambiente para ambiente e podemos ter mais espaços no campo obrigatório, como: New Virtual Machine Another New Virtual Machine NoSpaceHere

Então meu pensamento foi grep para a segunda instância da string específica VirtualMachines , já que VirtualMachines está lá no início da linha também.

Depois que a segunda VirtualMachines for correspondida, imprima tudo depois dessa correspondência apenas nessa linha, mas exclua as duas últimas colunas que é Virtual e Machine , pois isso é sempre constante.

Não foi possível descobrir uma sintaxe para isso. Alguma sugestão?

    
por suhas savkoor 02.08.2017 / 20:28

2 respostas

2

Como o grep do GNU tem um modo PCRE, provavelmente a maneira mais simples de obter o conteúdo após uma correspondência é usar o modificador perl \K , e. para combinar tudo até o último / e descartá-lo:

$ cat output | grep -Po '.*/\K.*'
Active Directory Virtual Machine
VM-Replicate     Virtual Machine

Para remover a parte final, você pode adicionar uma explícita em frente :

$ cat output | grep -Po '.*/\K.*(?=Virtual Machine)'
Active Directory
VM-Replicate
    
por steeldriver 02.08.2017 / 21:19
2

Aqui está minha solução sed para sua saída:

$ ... | sed -r 's:.*/(.*)Virtual Machine$::'
Active Directory 
VM-Replicate 

Notas:

  • .*/ parece do início ao último / :

    /vcenter-prod.happycow.local/VirtualMachines/Backup With Space Normal     /vcenter-prod.happycow.local/VirtualMachines/
    
  • Em seguida, procuramos algo antes de Virtual Machine usando (.*)Virtual Machine$ e substituímos toda a linha por qualquer coisa

por Ravexina 02.08.2017 / 20:51