纯粹从 bash 命令输出中解析列

纯粹从 bash 命令输出中解析列

我们需要从命令输出中提取列。我尝试过使用 awk 和 cut 命令的方法。然而,由于空格或其他字符的分隔符无法以正确的方式解析第二列输出,因此第二列值中有空格。我们是否有其他方法可以像上面提到的那样纯粹地获取输出的第二列?

# 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

如上图第二列的输出所示,我们没有原始文件中的完整值。

答案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

相关内容