Чистый анализ столбца из вывода команды bash

Чистый анализ столбца из вывода команды bash

Нам нужно извлечь столбец из вывода команды. Я пробовал методы с использованием команд awk и cut. В то время как у нас есть пробелы в значениях 2-го столбца, из-за которых разделитель для пробела или другого символа не анализирует вывод 2-го столбца правильным образом. Есть ли у нас другой метод, чтобы получить чисто второй столбец вывода, как указано выше?

# cat info.txt
Vmid      Name                                                 File                                 
369    DO-NOT-DELL                          [datastore1] DO-NOT-DELL/DO-NOT-DELL.vmx                                
389    VMware vCenter Server                [datastore1] VMware vCenter Server/VMware vCenter Server.vmx            
390    Auth-vcenter-Don't delete            [datastore1] Auth-vcenter-Don't delete/Auth-vcenter-Don't delete.vmx    
393    VirtualMachine                       [datastore1] VirtualMachine/VirtualMachine.vmx                                            
9      Server 2005 for VM (dev team)        [datastore1] Server 2005 for VM (dev team)      

# cat info.txt | awk '{print $2}'
DO-NOT-DELL
VMware
Auth-vcenter-Don't
VirtualMachine
Server

Как и в приведенном выше выводе 2-го столбца, у нас нет полного значения, как в исходном файле.

решение1

Можно разобратьстолбцы фиксированной ширины с GNU awk:

Разделение входной записи на поля фиксированной ширины задается путем присвоения строки, содержащей разделенные пробелами числа, встроенной переменной FIELDWIDTHS. Каждое число определяет ширину поля, включая столбцы между полями. Если вы хотите игнорировать столбцы между полями, вы можете указать ширину как отдельное поле, которое впоследствии игнорируется.

% awk -v FIELDWIDTHS="7 37 *" '{print $2}' foo
   Name                              
DO-NOT-DELL                          
VMware vCenter Server                
Auth-vcenter-Don't delete            
VirtualMachine                       
Server 2005 for VM (dev team)        

Вы также можете использовать регулярное выражение в качестве разделителя полей для разделения текста, например, используя 3 или более пробелов в качестве FS:

% awk -F ' {3,}' '{print $2}' foo
Name
DO-NOT-DELL
VMware vCenter Server
Auth-vcenter-Don't delete
VirtualMachine
Server 2005 for VM (dev team)

решение2

Я также нашел хороший подход от одного моего друга, как получить список виртуальных машин.

# cat info.txt | tr -s " " | cut -d "[" -f1 | cut -d " " -f2- | tail -n +2

                        
DO-NOT-DELL                          
VMware vCenter Server                
Auth-vcenter-Don't delete            
VirtualMachine                       
Server 2005 for VM (dev team)  

решение3

Преобразовать пробелы в табуляции с нестандартными позициями табуляции:

unexpand -t 7,44 info.txt | cut -f2

Связанный контент