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

时间:2015-02-19 15:49:35

标签: linux 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

这是一个错误&gt;&gt; sed:1:“/ servername.net ...”:命令我期望\后跟文本

请建议可以删除。

PS:我作为脚本的一部分运行它,所以我不必单独运行它。使用建议的选项运行时,我可以删除..但在脚本中,这不起作用并给出该错误。人们评论“或格式化,它只是我不能从那里复制,因为那是一个远程通过终端服务器。

2 个答案:

答案 0 :(得分:3)

尝试以下方法:

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

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

让我指出你只需要那一行,没有while循环,没有脚本!

答案 1 :(得分:2)

请注意,shell区分大小写,并期望"为双引号,而不是(此问题现已解决)。您需要将编辑器配置为不随机为您大写单词(现在也已修复)。请注意,对系统配置文件进行试验是A Bad Idea™。制作文件的副本并在副本上进行实验。只有当您确定脚本在副本上有效时才会冒实时文件的风险。然后在进行更改之前备份实时文件。 (并且尽可能避免以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。唯一的技巧是模式可能包含斜杠,因此\@符号表示'使用@作为搜索标记'。

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

如果你有GNU sed,当你对此感到满意时,你可以添加-i.bak选项来覆盖/etc/fstab文件(在{{中保留原文的副本) 1}})。或者使用/etc/fstab.bak获取当前日期/时间的备份扩展名。或者对文件使用版本控制。