Я выполняю эту команду:
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, поскольку это всегда является постоянным.
Не удалось определить синтаксис этого. Какие-либо предложения?
Поскольку 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
Вот мое решение 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$ и заменяем всю строку на что угодно Поскольку 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
Вот мое решение 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$ и заменяем всю строку на что угодно