
答え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の処理中に以前に抽出した2つの変数)から文字列(ここでは行全体$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"] }'