답변1
그리고 awk
:
awk 'NR==1{for(i=1;i<NF;i++){if($i=="OS_NATIVE_NAME"){s=index($0,$i); l=index($0,$(i+1))-s}}}
$1=="disk_0"{print substr($0,s,l)}' file
NR==1
첫 번째 라인(헤더 라인)인 경우NR
현재 처리 중인 라인 번호에 대한 awks 내부 변수입니다.for(i=1;i<NF;i++)
필드를 반복합니다.NF
현재 행의 필드 수를 나타내는 awks 내부 변수입니다.$i=="OS_NATIVE_NAME"
왜냐하면 각 필드를 반복하여 필드 값이 다음과 같은지 확인하기 때문입니다.OS_NATIVE_NAME
s=index(...)
필드가 시작되는 위치를 찾아 나중에 사용할 수 있도록 저장하세요.index()
다른 문자열(여기서는 전체 행) 내에서 문자열(여기서는 $i 값OS_NATIVE_NAME
)이 나타나는 위치를 가져오는 awks 문자열 함수입니다.$0
l=index(...)-s
필드의 길이를 구하고 나중에 사용하기 위해 저장합니다. 이전과 동일한 원리이지만 길이를 얻으려면s
필드에서 빼야 합니다.
$1=="disk_0"
DEVICE
disk_0
첫 번째 필드( 예제) 에서 검색하려는 내용을 찾으세요 .$1
첫 번째 필드를 나타냅니다.{print substr($0,s,l)}
마지막으로 각 줄을 인쇄하면 문자열은 position에서 시작s
하고 길이를 갖습니다l
.substr()
길이가 있는 위치(라인 1을 처리하는 동안 이전에 추출한 두 변수)에서 문자열(여기서는$0
전체 라인) 을 잘라내는 awks 문자열 함수입니다.s
l
인쇄(입력의 필드 위치에 관계없이):
sda
답변2
간단한 해결책:
data=$(vxdisk -e list)
devices=$(sed 's/ .*//' <<< "$data")
# I'm just guessing that the relevant column starts in column 80
os_native_name=$(cut -c80- <<< "$data")
row=0
for dev in $devices; do let row++; if [[ "$dev" = disk_1 ]]; then break; fi; done
# now we know our desired data is on the row'th line of os_native_name
# you can retrieve it for instance with
sed -n "$row p" <<< "$os_native_name"
답변3
다음 명령을 시도해 보십시오:
vmdisk -e list | awk 'NR==1 { for(i=1;i<=NF;i++) { ix[$i] = i } } NR>1 { print $ix["OS_NATIVE_NAME"] }'