答案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()
是 awks 字符串函数,用于获取字符串(此处为 $i 的值,因此OS_NATIVE_NAME
)在另一个字符串(此处为$0
,因此为整行)中出现的位置。l=index(...)-s
获取字段的长度并将其保存以供以后使用:与之前的原理相同,但要获取长度,我们必须s
从中减去。
$1=="disk_0"
DEVICE
在第一个字段中找到您正在搜索的内容(disk_0
在示例中)。$1
代表第一个字段。{print substr($0,s,l)}
最后打印每一行,字符串从位置开始s
,长度为l
。substr()
是 awks 字符串函数,用于从具有长度的位置(我们之前在处理第 1 行时提取的两个变量)剪切字符串(此处$0
为整行)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"] }'