【问题标题】:Create an array with device logical name based on list of serial numbers根据序列号列表创建具有设备逻辑名称的阵列
【发布时间】:2019-11-24 14:48:44
【问题描述】:

我想根据我从 api 调用中得到的 UUID 列表来识别磁盘。

Linux VM 上的设备列表如下:

NAME="sda" SERIAL="NUTANIX_NFS_5_0_70509_a07b6add_60c9_4758_8b27_0afe77820dbd"
NAME="sdb" SERIAL="NUTANIX_NFS_18_0_625_ae748138_9bc0_4499_8068_d00a84a800b6"
NAME="sdc" SERIAL="NUTANIX_NFS_18_0_626_8a082956_a2be_42ca_a14b_7d21ed3d5a2d"
NAME="sdd" SERIAL="NUTANIX_NFS_18_0_627_6185353f_5c13_47ab_af58_b72d4d07106b"
NAME="sde" SERIAL="NUTANIX_NFS_18_0_628_fbeed366_6956_4de1_a217_487d75fd003c"
NAME="sdf" SERIAL="NUTANIX_NFS_18_0_629_019dcefb_0e1b_4086_96a9_982ae52fd88a"
NAME="sdg" SERIAL="NUTANIX_NFS_18_0_630_5d0b55e8_d0bd_4ee4_a2be_0bef88d94732"
NAME="sdh" SERIAL="NUTANIX_NFS_18_0_631_823beaed_1c2e_4203_ab5f_be294382d0c5"
NAME="sdi" SERIAL="NUTANIX_NFS_18_0_632_e4ee8620_5b53_4187_8f8c_7123ee8d3486"
NAME="sdj" SERIAL="NUTANIX_NFS_18_0_633_41551a1b_7dd9_4fd4_95bc_1fcdebb9dc85"
NAME="sdk" SERIAL="NUTANIX_NFS_18_0_634_12d517fc_e726_4512_b176_5d4075d0ecfe"
NAME="sdl" SERIAL="NUTANIX_NFS_18_0_635_d682eee4_cec0_4809_9efe_97aec7bf15d0"
NAME="sdm" SERIAL="NUTANIX_NFS_18_0_636_59ea679e_cbd3_4cf5_a974_67409b719391"
NAME="sdn" SERIAL="NUTANIX_NFS_18_0_637_5523c88e_310a_4fb6_b76f_48f624d1ce1f"
NAME="sdo" SERIAL="NUTANIX_NFS_18_0_638_0e189f7a_785d_46f1_bb56_8f422d421ecb"
NAME="sdp" SERIAL="NUTANIX_NFS_18_0_639_9143ba87_d742_4130_bbe0_2084e8ebad3f"
NAME="sdq" SERIAL="NUTANIX_NFS_18_0_640_3b823817_c2b6_49af_9a55_fc4706216501"

我要识别的驱动器列表格式如下:

'ae748138_9bc0_4499_8068_d00a84a800b6'
'8a082956_a2be_42ca_a14b_7d21ed3d5a2d'
'6185353f_5c13_47ab_af58_b72d4d07106b'
'fbeed366_6956_4de1_a217_487d75fd003c'
'019dcefb_0e1b_4086_96a9_982ae52fd88a'
'5d0b55e8_d0bd_4ee4_a2be_0bef88d94732'
'823beaed_1c2e_4203_ab5f_be294382d0c5'
'e4ee8620_5b53_4187_8f8c_7123ee8d3486'
'41551a1b_7dd9_4fd4_95bc_1fcdebb9dc85'
'12d517fc_e726_4512_b176_5d4075d0ecfe'
'd682eee4_cec0_4809_9efe_97aec7bf15d0'
'59ea679e_cbd3_4cf5_a974_67409b719391'
'5523c88e_310a_4fb6_b76f_48f624d1ce1f'
'0e189f7a_785d_46f1_bb56_8f422d421ecb'
'9143ba87_d742_4130_bbe0_2084e8ebad3f'
'3b823817_c2b6_49af_9a55_fc4706216501'

我只需要确定该列表中 UUID 的逻辑名称,以便从中创建 LVM 卷组。但我不明白如何从那里开始。任何人都可以提出一个例子?

【问题讨论】:

    标签: arrays bash list scsi


    【解决方案1】:

    从 UUID 列表中删除 's 后(可以使用 tr 完成),您可以简单地使用 grep 从设备列表中提取相应的行。要从这些行中仅提取 NAME="..." 的值,请使用 cut

    grep -Ff <(tr -d \' < fileListOfUUIDs) fileListOfDevices | cut -d\" -f2
    

    如果您向我们展示的输入不是存储在文件中而是由您可以使用的命令生成的

    commandListOfDevices | grep -Ff <(commandListOfUUIDs | tr -d \') | cut -d\" -f2
    

    【讨论】:

    • 谢谢。工作正常。 lsblk -nodeps -no name,serial -PS /dev/sd* | grep -Ff &lt;(cat vmdisks_uuid.txt | tr -d \') | cut -d\" -f2不幸的是,我不能投票...这里还没有足够的声誉
    • 很高兴我能帮上忙。没问题,你还不能投票。但是,由于这解决了您的问题,如果您能接受这个答案,我会很高兴。接受答案也会关闭问题。单击此答案左上角此答案分数下方的复选标记。
    【解决方案2】:

    您正在尝试从一组标记生成的匹配结果中提取字段值sedawk 可以解决问题。

    要从其中一个匹配结果中提取名为 NAME 的字段的值,只需执行以下操作:

    josh@linux ~ $ result='NAME="sda" FSTYPE="ext4" SERIAL="NUTANIX_...dbd"'
    josh@linux ~ $ echo $result | sed -e 's/.*NAME="//; s/".*//;'
    sda
    

    从同一匹配结果中提取名为FSTYPE的字段的值:

    josh@linux ~ $ echo $result | sed -e 's/.*FSTYPE="//; s/".*//;'
    ext4
    

    如果字段的顺序发生变化怎么办? ..同样的代码也可以。

    josh@linux ~ $ result='FSTYPE="ext4" NAME="sda" SERIAL="NUTANIX_...dbd"'
    josh@linux ~ $ echo $result | sed -e 's/.*NAME="//; s/".*//;'
    sda
    

    考虑到这一点,然后可以循环处理从所有匹配结果中提取字段值。我创建了一个小脚本来自动化该过程,我将其发布在这里,希望它会有所帮助。

    #!/bin/bash
    
    #
    # usage: doodle -F <file-containing-pattern(s)>
    #        doodle -P <pattern(s)>
    #
    
    if [ $# -ne 2 ]; then
    echo 'invalid argument...'; exit;
    else
    pattern=
    fi
    
    if [ "$1" == "-F" ]; then
    if [ ! -r $2 ]; then
    echo "unable to read - $2"; exit
    else
    pattern=$(cat $2)
    fi
    elif [ "$1" == "-P" ]; then
    pattern=$2
    else
    echo 'invalid argument...'; exit;
    fi
    
    if [ -z "$pattern" ]; then
    echo 'invalid argument...'; exit;
    fi
    
    declare -a buffer
    readarray buffer
    
    if [ ${#buffer[*]} -gt 0 ]; then
    for token in $pattern; do
    for i in ${!buffer[*]}; do
    match=$(echo ${buffer[i]} | sed -n "/$token/=");
    if [ -n "$match" ]; then
    ##### Option 1 ##############################################################
    # Uncomment the next line to print the same result that 'grep' would print.
    #echo -e $(echo ${buffer[i]} | sed "s/$token/\\\\e[91m$token\\\\e[0m/");
    
    ##### Option 2 ##############################################################
    # Uncomment the next line to print characters before the first [:space:]
    #echo ${buffer[i]} | awk -F' ' '{ print $1 }';
    
    ##### Option 3 ##############################################################
    # Uncomment the next line to email device-id to NSA
    #TODO...
    
    ##### Option 4 ##############################################################
    # Uncomment the next line to extract value of 'NAME' field
    echo ${buffer[i]} | sed -e 's/.*NAME="//; s/".*//;'
    
    ##### Additional Option #####################################################
    # Uncomment the next line (break command) to process one match per token
    break;
    fi
    done
    done
    fi
    
    unset buffer
    

    要使用这个脚本,只需:

    1. 将上述 sn-p 中的文本复制到一个名为 doodle 的文件中。
    2. 打开终端并输入:
    josh@linux ~ $ chmod a+x doodle
    

    处理保存在名为 device-id.txt 的文件中的令牌:

    josh@linux ~ $ lsblk -nodeps -no name,serial -PS /dev/sd* | ./doodle -F device-ids.txt
    

    处理作为单个字符串提供的令牌:

    josh@linux ~ $ lsblk -nodeps -no name,serial -PS /dev/sd* | ./doodle -P 'ae748138_9bc0_4499_8068_d00a84a800b6
    8a082956_a2be_42ca_a14b_7d21ed3d5a2d
    6185353f_5c13_47ab_af58_b72d4d07106b
    ...
    3b823817_c2b6_49af_9a55_fc4706216501'
    

    该脚本非常通用,您可以轻松调整它以用于相关问题。你会在互联网上找到很多关于bashsedawk 的教程。 gnu.org 上还有一个全面的 bash 参考资料。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-26
      • 2012-01-27
      • 1970-01-01
      • 2021-02-16
      • 1970-01-01
      相关资源
      最近更新 更多