コマンド出力から列を抽出する必要があります。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