Как разобрать текстовые блоки и получить значение в зависимости от другого значения в этом блоке - PullRequest
1 голос
/ 18 июня 2020

Давайте рассмотрим пример вывода vboxmanage list hdds:

UUID:           abc
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /home/me/VirtualBox VMs/not_me/b.vmdk
Storage format: VMDK
Capacity:       100000 MBytes
Encryption:     disabled

UUID:           def
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /home/me/VirtualBox VMs/my_file/a.vmdk
Storage format: VMDK
Capacity:       100000 MBytes
Encryption:     disabled

UUID:           ghi
Parent UUID:    base
State:          created
Type:           normal (base)
Location:       /home/me/VirtualBox VMs/my_file/a.vmdk
Storage format: VMDK
Capacity:       100000 MBytes
Encryption:     disabled

Я хотел бы получить такой результат:

def
ghi

Другими словами, мне нужно UUID дисков из /home/me/VirtualBox VMs/my_file, а не UUID, принадлежащий /home/me/VirtualBox VMs/not_me/b.vmdk

Ответы [ 3 ]

1 голос
/ 18 июня 2020

Использование grep и sed:

vboxmanage list hdds | grep -B 4 '/home/me/VirtualBox VMs/my_file/' | 
sed -n 's/^UUID:\s*//p'
0 голосов
/ 18 июня 2020

Использование :

vboxmanage list hdds | awk '$1=="UUID:"{uid=$2} /^Location:.*my_file/{print uid}'

Результат:

def
ghi
0 голосов
/ 18 июня 2020

Используя , при этом порядок строк может измениться, в отличие от других ответов:

vboxmanage list hdds | perl -lne '
    BEGIN{ $/ = "\n\n" }
    print $1 if m/UUID:\s+(\w+)\s+.*my_file/s
'

Вывод

def
ghi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...