純粹解析 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

相關內容