我们需要从命令输出中提取列。我尝试过使用 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