Sed 从blkid程序输出中筛选UUID的正确工具(使用grep、cut或awk、e.t.c)

Sed 从blkid程序输出中筛选UUID的正确工具(使用grep、cut或awk、e.t.c),sed,awk,grep,Sed,Awk,Grep,我想过滤blkid的输出以获得UUID blkid的输出如下所示 案例1:- $ blkid /dev/sda2: LABEL="A" UUID="4CC9-0015" /dev/sda3: LABEL="B" UUID="70CF-169F" /dev/sda1: LABEL=" NTFS_partition" UUID="3830C24D30C21234" $ blkid /dev/sda1: UUID="d7ec380e-2521-4fe5-bd8e-b7c02ce41601" TYPE

我想过滤blkid的输出以获得UUID

blkid的输出如下所示

案例1:-

$ blkid
/dev/sda2: LABEL="A" UUID="4CC9-0015"
/dev/sda3: LABEL="B" UUID="70CF-169F"
/dev/sda1: LABEL=" NTFS_partition" UUID="3830C24D30C21234"
$ blkid
/dev/sda1: UUID="d7ec380e-2521-4fe5-bd8e-b7c02ce41601" TYPE="ext4" 
/dev/sda2: UUID="fc54f19a-8ec7-418b-8eca-fbc1af34e57f" TYPE="ext4" 
/dev/sda3: UUID="6f218da5-3ba3-4647-a44d-a7be19a64e7a" TYPE="swap" 
在某些情况下,blkid的输出如下所示

案例2:-

$ blkid
/dev/sda2: LABEL="A" UUID="4CC9-0015"
/dev/sda3: LABEL="B" UUID="70CF-169F"
/dev/sda1: LABEL=" NTFS_partition" UUID="3830C24D30C21234"
$ blkid
/dev/sda1: UUID="d7ec380e-2521-4fe5-bd8e-b7c02ce41601" TYPE="ext4" 
/dev/sda2: UUID="fc54f19a-8ec7-418b-8eca-fbc1af34e57f" TYPE="ext4" 
/dev/sda3: UUID="6f218da5-3ba3-4647-a44d-a7be19a64e7a" TYPE="swap" 
我想过滤掉UUID

使用grepcut的组合,可以如下所示

/sbin/blkid | /bin/grep 'sda1' | /bin/grep -o -E 'UUID="[a-zA-Z|0-9|\-]*' | /bin/cut -c 7-
我已尝试使用awkgrepcut过滤UUID,如下所示

$ /sbin/blkid | /bin/grep 'sda1' | /usr/bin/awk '{print $2}' | /bin/sed 's/\"//g' | cut -c 7-
7ec380e-2521-4fe5-bd8e-b7c02ce41601
上述命令(使用awk)不可靠,因为如上述输出所示,blkid程序的输出中有时会出现额外的字段,如标签

使用可靠工作的awk创建命令的最佳方法是什么? 如果使用bin和core utils的作业存在任何其他优雅的方法,请发布。我不想使用perl或python,因为这必须在busybox上运行

注意:-我使用的是busyboxblkid,其中/dev/sda1不能作为args传递给它(我使用的版本不支持它),因此grep会过滤该行


更新:-添加了案例2:-输出以表明无法依赖字段位置。

对于所有UUID,您可以执行以下操作:

$ blkid | sed -n 's/.*UUID=\"\([^\"]*\)\".*/\1/p' 
d7ec380e-2521-4fe5-bd8e-b7c02ce41601
fc54f19a-8ec7-418b-8eca-fbc1af34e57f
6f218da5-3ba3-4647-a44d-a7be19a64e7a
例如,仅针对特定sda1:

$ blkid | sed -n '/sda1/s/.*UUID=\"\([^\"]*\)\".*/\1/p' 
d7ec380e-2521-4fe5-bd8e-b7c02ce41601
sed命令尝试将UUID关键字后双引号中的内容分组,并用标记替换整行。

data.txt
awk
sed
组合 说明:
  • 将字段分隔符设置为字符串“UUID”,
    $2
    将给出剩余的输出
  • 然后使用sed删除
    =
    ,如图所示,其中
    -e
    是一个开关,因此您可以在一个开关中给出多个sed命令/表达式
  • 所有出现的
    都将使用结束
    g
    选项(即全局)删除

  • 下面是一个简短的
    awk
    解决方案:

    blkid | awk 'BEGIN{FS="[=\"]"} {print $(NF-1)}'
    
    输出:

    4CC9-0015
    70CF-169F
    3830C24D30C21234
    
    blkid | awk 'BEGIN{FS="="} {print $NF}' | sed 's/"//g'
    
    说明:

    4CC9-0015
    70CF-169F
    3830C24D30C21234
    
    blkid | awk 'BEGIN{FS="="} {print $NF}' | sed 's/"//g'
    
    • 开始{FS=“[=\”]”}
      :使用
      =
      作为分隔符
    • {print$(NF-1)}
      NF
      表示字段数;这里我们打印第二个到最后一个字段
    • 这是基于blkid输出的一致结构:
      UUID
      中的引号位于每行的末尾
    或者:

    4CC9-0015
    70CF-169F
    3830C24D30C21234
    
    blkid | awk 'BEGIN{FS="="} {print $NF}' | sed 's/"//g'
    

    你为什么把它弄得这么复杂

    试试这个:

    #blkid-s UUID-o值
    d7ec380e-2521-4fe5-bd8e-b7c02ce41601
    fc54f19a-8ec7-418b-8eca-fbc1af34e57f
    6f218da5-3ba3-4647-a44d-a7be19a64e7a
    
    或者这个:

    #blkid-s UUID-o值/dev/sda1
    d7ec380e-2521-4fe5-bd8e-b7c02ce41601
    
    如果您没有合适的blkid软件包,请安装:

    sudo-apt-get-install-util-linux
    sudo-yum安装util-linux
    
    这个问题有一个“e.t.c”,所以我假设python是选项之一;)


    虽然,这可能是杀伤力过大,而且这个脚本XD中缺少了很多错误处理/优化,但我假设您正在initramfs中使用busybox,并且您正在等待您的例如带有rootfs的USB驱动器可用

    您可以使用以下awk脚本(busybox awk兼容)

    从init脚本中调用它,如下所示;这不是最理想的方式

    # The UUID of your root partition
    export RUUID="<put proper uuid value here>"
    
    for x in 1, 2, 3, 4, 5 ; do
      mdev -s
      found=$(blkid | awk -f ./get-ruuid.awk)
      test -z $found || break; # If no longer zero length, break the loop.
      sleep 1
    done
    
    #根分区的UUID
    导出RUUID=“”
    对于1,2,3,4,5中的x;做
    mdev-s
    found=$(blkid | awk-f./get ruuid.awk)
    测试-z$found | break;#如果长度不再为零,则断开循环。
    睡眠1
    完成
    
    但是,如果这是您希望使用initramfs的唯一原因,那么我将使用'root=PARTUUID=。。。waitroot的Linux内核命令行选项。检查内核文档和源代码


    使用blkid命令获取根分区的正确部分UUID(而不是UUID)。

    我只需:
    sudo blkid | cut-d'-f2 | cut-d\'-f2
    字段位置是不可靠的。程序的示例是$blkid/dev/sda2:LABEL=“A”UUID=“4CC9-0015”/dev/sda3:LABEL=“B”UUID=“70CF-169F”/dev/sda1:LABEL=“NTFS\u partition”UUID=”3830C24D30C21234“/usr/etc/udev/rules.d#blkid|cut-d'-f2 | cut-d\'-f2 A b检查此项:
    sudo blkid|grep-oP'UUID=[0-9a-zA-Z']+“
    字段位置不可靠,请看案例2:-解决方案不起作用的输出。字段位置不可靠,请看案例2:-解决方案不起作用的输出。太好了!比使用正则表达式更好。如果你有一个真正的blkid,看起来很好,但不是在busybox的blkid上——这就是为什么人们不喜欢oking for parsing solutionsWarning!这将在GPT上生成不正确的UUID!在GPT上,除了UUID还有PARTUUID,因此您的regexp将在这一点上匹配,因为它通常在后面的行中。要修复此问题,请在“UUID”之前添加一个空格。此外,要获取特定驱动器的UUID,您无需对其进行解析,只需使用
    blkid