Sed 从blkid程序输出中筛选UUID的正确工具(使用grep、cut或awk、e.t.c)
我想过滤blkid的输出以获得UUID blkid的输出如下所示 案例1:-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
/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
使用grep和cut的组合,可以如下所示
/sbin/blkid | /bin/grep 'sda1' | /bin/grep -o -E 'UUID="[a-zA-Z|0-9|\-]*' | /bin/cut -c 7-
我已尝试使用awk、grep和cut过滤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
组合
说明:
$2
将给出剩余的输出=
和“
,如图所示,其中-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