注释 fstab 文件中包含相关 UUID 号的特定行

注释 fstab 文件中包含相关 UUID 号的特定行

我们想要注释fstab文件中包含相关UUID数字的特定行

例子:

Disk=sde
UUID_STRING=`  blkid | grep $Disk | awk '{print $2}' `
echo $UUID_STRING
UUID="86d58af9-801b-4c25-b59d-80b52b4acc61"


sed -e "/$UUID_STRING/ s/^#*/#/" -i /etc/fstab

但来自/etc/fstab,该行 - UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0- 未注释

more /etc/fstab

UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /data/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /data/sdd ext4 defaults,noatime 0 0
UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /data/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /data/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /data/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /data/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /data/sdb ext4 defaults,noatime 0 0

是否可以忽略 --> "?在 sed 命令中 - sed -e "/$UUID_STRING/ s/^#*/#/" -i /etc/fstab

其他解决方案可能是

 uuid_capture=`  echo $UUID_STRING | sed s'/"/ /g' | awk '{print $NF}' `
 sed -e "/$uuid_capture/ s/^#*/#/" -i /etc/fstab

more /etc/fstab

UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /grid/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /grid/sdd ext4 defaults,noatime 0 0
#UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /grid/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /grid/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /grid/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /grid/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /grid/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /grid/sdb ext4 defaults,noatime 0 0

答案1

您的代码的唯一问题是您的变量包含双引号中的 UUID,而 in 中的 UUID/etc/fstab不在引号中。

建议:使用现有的export输出格式来允许您输出,这将设置相关的 shell 变量,例如.然后在您的命令中使用。blkidevalUUID$UUIDsed

eval "$( blkid -o export /dev/"$Disk" )"

sed -i '/^UUID='"$UUID"'/ s/^/#/' /etc/fstab

这将找到以 开头的行,UUID=后跟您的 UUID 字符串。这些行的#开头会有一个字符。

由于初始模式锚定到行的开头,因此#如果重新运行命令,这也可以避免多次添加字符。

当仅给出单个表达式-e时不需要该选项,并且通常在编辑表达式之前给出。sed-i

你也可以awk像这样使用 GNU:

awk -i inplace -v uuid="$UUID" '$1 == "UUID=" uuid { $0 = "#" $0 }; 1' /etc/fstab

...鉴于您提供的数据,这会产生相同的效果。它使用inplace自 GNU 4.1.0 起可用的源模块awk来执行就地编辑,sed -i其方式与它大致相同(另请参见如何使用 awk 就地更改文件? (与“sed -i”一样))。

实际代码将第一个字段与UUID=后面的 UUID 字符串进行比较,如果匹配,则通过在#开头添加 a 来修改该行。所有行,无论是否修改,都会被打印(输出到输出文件)。

这一切都是假设你无法工作直接地与类似的东西/etc/fstab一起使用$Disk

sed -i '\|^UUID=.* /data/'"$Disk"' | s/^/#/' /etc/fstab

或者

awk -i inplace -v disk="$Disk" '!/^#/ && $2 == "/data/" disk { $0 = "#" $0 }; 1' /etc/fstab

在上述所有情况下,注释字符#可以是任何字符串,例如###FAULTY_DISK###

答案2

编辑2:我刚刚注意到你的UUID_STRING变量UUID="86d58af9-801b-4c25-b59d-80b52b4acc61"不仅仅是 UUID 字符串。我首先建议通过使用-F\"告诉awk用作"字段分隔符的选项使变量仅包含 UUID 字符串:

UUID_STRING="$( blkid | grep $Disk | awk -F\" '{print $2}' )"
echo $UUID_STRING
86d58af9-801b-4c25-b59d-80b52b4acc61

完成上述操作后,我认为注释该fstab行的最直接方法是:sed "s/^.*$UUID_STRING/#&/" /etc/fstab(注意:我原来的答案有单引号,这对于变量扩展来说是不正确的)。

^.*$UUID_STRING将包括匹配行的开头和#&将在其前面加上#.

sed "s/^.*$UUID_STRING/#&/" /etc/fstab
UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /data/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /data/sdd ext4 defaults,noatime 0 0
#UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /data/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /data/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /data/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /data/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /data/sdb ext4 defaults,noatime 0 0

如果您确定它有效,请添加-i覆盖原始文件的选项。

答案3

使用 GNU sed 您可以执行以下操作。通过 bash 参数扩展操作左侧的 UUID_STRING 变量,通过 sed 正则表达式操作右侧的 UUID_STRING 变量来分割需要注释的行。

sed -Ei "
  /^UUID=${UUID_STRING#*\"}?/ s/^/#/
" /etc/fstab

答案4

使用(以前称为 Perl_6)

raku -pe 's/ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") /\#\#\#FAULTY_DISK\#\#\#$0/;' fstab_test.txt

或者

raku -pe 's[ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") ] = "\#\#\#FAULTY_DISK\#\#\#$0";'

输入示例:

UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /data/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /data/sdd ext4 defaults,noatime 0 0
UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /data/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /data/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /data/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /data/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /data/sdb ext4 defaults,noatime 0 0

示例输出:

UUID=cb47ad8e-5b90-4ddc-97f5-2c0fa1f1b7e7 /data/sdc ext4 defaults,noatime 0 0
UUID=169da708-3c48-4306-beba-95dab722d3ab /data/sdd ext4 defaults,noatime 0 0
###FAULTY_DISK###UUID=86d58af9-801b-4c25-b59d-80b52b4acc61 /data/sde ext4 defaults,noatime 0 0
UUID=640e2c41-d5c6-4e02-beb9-714ec99e16e2 /data/sdf ext4 defaults,noatime 0 0
UUID=58a8cddf-7ce9-431c-bb71-f4f44c8d62a5 /data/sdg ext4 defaults,noatime 0 0
UUID=6779c108-f74b-4a05-8faf-cf8752844c53 /data/sdh ext4 defaults,noatime 0 0
UUID=3c2352f6-df8e-4b14-b6c0-60caaef0dce0 /data/sdi ext4 defaults,noatime 0 0
UUID=ba59e473-d856-4c8b-a3be-4bfc40009f0d /data/sdb ext4 defaults,noatime 0 0

上面是用 Raku(Perl 编程语言家族的成员)编写的答案。 Raku 实现了有限数量的命令行标志,-pe这里使用了(自动打印、代码执行)标志。两个答案都使用 Raku 的s///替换运算符;第二个例子s[…] = "…"是一个较新的(反斜线较少的)变体。如果需要全局匹配,请在 ,:global之后在运算符开头插入副词s,如 s:global///s:g///

说到反斜杠,#在我的特定系统上转义 octothorpes 是不必要的,但如果包含的话也不会有害。转义的反斜杠包含在 的用户中vim,因为上面带有转义的 octothorpes(在双引号字符串内)的答案可以直接在命令vim行(Ex 模式)上使用,例如:

:%! raku -pe 's[ ^ ("UUID=86d58af9-801b-4c25-b59d-80b52b4acc61") ] = "\#\#\#FAULTY_DISK\#\#\#$0";' 

相关内容