使用 sed 从 /etc/fstab 中删除条目

Delete entry from /etc/fstab using sed

我正在编写一个解决方案,其中当共享驱动器从服务器中删除时,我们也需要从 fstab 中删除该条目。

到目前为止我做了什么:

MP="${ServerAddress}:${DirectoryPath} ${MountPoint} nfs defaults 0 0"

while read line; do
                if [ "${MP}" = "${line}" ]; then
                    sed "/${line}/d"
                fi
done < /etc/fstab

这是一个错误 >> sed: 1: "/servername.net...": command I expects \ followed by text

请建议可以删除。

PS:我运行将其作为脚本的一部分,因此我不必单独运行。虽然 运行 建议的选项,我可以删除.. 但是在脚本期间,这不起作用并给出该错误。人们对 " 或格式发表评论,只是我无法从那里复制,因为那是通过终端服务器进行的远程操作。

尝试以下操作:

sed -i.bak "\@^$SERVERADDR:$DIRPATH@d" /etc/fstab

为 SERVERADDR 和 DIRPATH 设置有意义的值后。该行还将备份旧文件(名为 fstab.bak)。但是由于/etc/fstab是一个非常重要的文件,请确保手头有更多的备份。

我要指出的是,您只需要那一行,没有 while 循环,没有脚本!

请注意,shell 区分大小写,并期望 " 作为双引号而不是 (问题现已解决)。您需要将您的编辑器配置为不要为您随机将单词大写(现在也已修复)。请注意,对系统配置文件进行试验是一个坏主意™。复制文件并在副本上进行实验。只有当您确定脚本在副本上有效时,您才会冒着实时文件的风险。然后在进行更改之前备份实时文件。 (并尽可能避免以 root 身份进行试验;这会限制您可以造成的损害。)

您编写的脚本还不如不使用 sed。将比较更改为 != 并简单地使用 echo "$line" 将您想要的行回显到标准输出。

MP="${ServerAddress}:${DirectoryPath} ${MountPoint} nfs defaults 0 0"

while read line; do
    if [ "${MP}" != "${line}" ]; then
    echo "$line"
    fi
done < /etc/fstab

或者,您可以在单个命令中使用 sed。唯一的技巧是该模式可能包含斜杠,因此 \@ 表示法表示 'use @ as the search marker'.

MP="${ServerAddress}:${DirectoryPath} ${MountPoint} nfs defaults 0 0"
sed -e "\@$MP@d" /etc/fstab

如果您有 GNU sed,当您对此感到满意时,您可以添加 -i.bak 选项来覆盖 /etc/fstab 文件(在/etc/fstab.bak)。或者使用 -i $(date +'%Y%m%d.%H%M%S') 获取当前 date/time 的备份扩展名。或者对文件使用版本控制。