/etc/fstab
我们的目标是创建 bash 脚本,从文件中删除未使用/不必要的 UUID 编号,
简要背景- 在我们的实验室中,我们有超过 500 台 RHEL 服务器,我们希望修复配置fstab
不正确的文件,fstab
如未使用的 UUID 编号或注释行中未使用的 UUID 编号等
我们创建以下 bash 脚本作为示例。
#!/bin/bash
blkid_list_of_uuid=` blkid | awk -F'UUID=' '{print $2}' | awk '{print $1}' | sed s'/"/ /g' `
grep UUID /etc/fstab >/tmp/fstab
while read line_from_fstab
do
echo "checking if ${line_from_fstab} is unused UUID"
if [[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]]
then
#sed -i "/$line_from_fstab/d" /etc/fstab
echo "delete unused line ${line_from_fstab} from fstab"
fi
done < /tmp/fstab
我们捕获了变量blkid
中的数字blkid_list_of_uuid
。并将 fstab 中的 UUID 行过滤到/tmp/fstab
文件中
if 语法的目标 -[[ ! ${line_from_fstab} =~ $blkid_list_of_uuid ]]
是通过 sed 删除(现在在注释中)其中/etc/fstab
未使用的UUID 行
但正则表达式不起作用,脚本实际上删除了正在使用的 UUID
blkid 的示例
blkid
/dev/mapper/vg-VOL_root: UUID="49232c87-6c49-411d-b744-c6c847cfd8ec" TYPE="xfs"
/dev/sda2: UUID="Y5MbyB-C5NN-hcPA-wd9R-jmdI-02ML-W9qIiu" TYPE="LVM2_member"
/dev/sda1: UUID="0d5c6164-bb9b-43f4-aa9b-092069801a1b" TYPE="xfs"
/dev/mapper/vg-VOL_swap: UUID="81140364-4b8e-412c-b909-ef0432162a45" TYPE="swap"
/dev/mapper/vg-VOL_var: UUID="e1574eeb-5a78-4a52-b7e3-c53e2b8a4220" TYPE="xfs"
/dev/sdb: UUID="547977e2-a899-4a75-a31c-e362195c264c" TYPE="ext4"
/dev/mapper/vg-VOL_docker: UUID="2e1a2cbf-9920-4e54-8b6b-86d0482c5f7b" TYPE="xfs"
/dev/sdc: UUID="1a289232-0cfe-4df7-9ad5-6a6e2362a1c5" TYPE="ext4"
/dev/sdd: UUID="91493d1f-ffe9-4f5f-aa6d-586d2c99f029" TYPE="ext4"
/dev/sde: UUID="f11845e7-1dcb-4b81-a1d4-9a5fe7da6240" TYPE="ext4"
它不起作用的原因是你试图匹配错误的东西。这是您的
blkid
变量包含的内容:这意味着:
变成这样:
fstab
当然,这永远不会是真的:您正在找到的 UUID 列表中搜索整行。你想做的就是寻找唯一UUID
。不要这样做,使用其他答案中给出的方法之一,使用 shell 来做这种事情是一个坏主意,但为了完成,这里有一个主要基于 shell 的方法,使用我认为你的意思的逻辑使用(请注意,这需要 GNU
grep
):这些
BAD:
是我的文件中的 UUID ,但在我的系统/etc/fstab
的输出中找不到。blkid
没有示例输入和预期输出,这是一个未经测试的猜测,但我认为这就是你想要的,使用任何 awk:
上面假设输出格式如https://linux.101hacks.com/unix/blkid
blkid
所示:内容格式如https://wiki.archlinux.org/title/fstab
/etc/fstab
所示:通过快速谷歌搜索发现。
我不确定您是否可以使用 uuid 列表作为正则表达式。
为了得到我用过的这个列表
在哪里
-F\"
用作"
分隔符for(i=1;i<=NF;i++)
走线if ($i ~ / UUID=/ )
如果找到 UUID=(space在 UUID 为强制之前)...{ i++ ; print $i ; break ; } }'
.. 获取下一个字段(实际的 UUID)并打印它,退出循环。接下来我使用普通的
grep
(可以用来
grep -q
减少垃圾)这导致
很少需要管道两个
awk
和一个sed
blkid_list_of_uuid 也可以存储在临时文件中,从而导致(不会工作,因为
${line_from_fstab}
不是 uuid)正如所指出的,从长远来看,在 500 个虚拟机中部署和运行 bash 脚本可能不是一个好主意,我会考虑 ansible。
terdon 回答了你做错了什么。我将仅提供一个更简单的方法的示例来完成您尝试的操作:
这应该按照您想要的方式输出 fstab,区别在于它不会像正则表达式或潜在
sed
命令那样对待 UUID。您可以将输出定向到/tmp/fstab
然后将其移动到/etc/fstab
。我使用了
lsblk
not ,blkid
因为联机帮助页blkid
建议lsblk
改为,并且lsblk
不需要 root 权限,而blkid
显然需要 root 权限。