bash:grep动态列的内容

bash:grep动态列的内容

我有数据如下:

在此输入图像描述

我需要得到的是OS_NATIVE_NAME特定的DEVICE

我知道一种方法是使用以下方法打印其列值:

awk '{print $*col_num*}'

但其列号OS_NATIVE_NAME并不固定。这是因为,其他字段(STATUS例如)可以具有不同的值(有时可能是多个),这导致了没有固定列号的问题OS_NATIVE_NAME,这是我的测试所需的数据。

我如何 grep 该特定列的内容?

答案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,长度为lsubstr()是 awks 字符串函数,用于从具有长度的位置(我们之前在处理第 1 行时提取的两个变量)剪切字符串(此处$0为整行)sl

打印(无论该字段位于输入中的哪个位置):

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"] }'

相关内容