명령 출력에서 열을 추출해야 합니다. 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)
정규식을 필드 구분 기호로 사용하여 텍스트를 분할할 수도 있습니다. 예를 들어 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