Содержимое 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 Directory и VM-Replicate

Обратите внимание, что этот результат может измениться из среды в среду, и у нас может быть больше пробелов в требуемом поле, например: New Virtual Machine Another New Virtual Machine NoSpaceHere

Так что моя мысль была grep для второго экземпляра конкретной строки VirtualMachines, так как VirtualMachines находится в начале строки.

Затем, как только вторая VirtualMachines будет сопоставлена, напечатайте все после этого совпадения только в этой строке, но исключите последние два столбца, которые являются Virtual и Machine, поскольку это всегда является постоянным.

Не удалось определить синтаксис этого. Какие-либо предложения?

1
задан 3 August 2017 в 01:37

4 ответа

Поскольку 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
ответ дан 18 July 2018 в 09:11

Вот мое решение 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$ и заменяем всю строку на что угодно
2
ответ дан 18 July 2018 в 09:11

Поскольку 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
ответ дан 24 July 2018 в 19:16

Вот мое решение 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$ и заменяем всю строку на что угодно
2
ответ дан 24 July 2018 в 19:16

Другие вопросы по тегам:

Похожие вопросы: