bashコマンドの出力から列を純粋に解析する

bashコマンドの出力から列を純粋に解析する

コマンド出力から列を抽出する必要があります。awk と cut コマンドを使用する方法を試しました。2 列目の値にスペースが含まれているため、スペースまたはその他の文字の区切り文字によって 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)        

テキストを分割するためにフィールド区切り文字として正規表現を使用することもできます。たとえば、FS として 3 つ以上のスペースを使用します。

% 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

関連情報