我发现了一些我试过的东西,但没有用。基本上我需要用一行来修改/ etc / export,但是在添加文件之前要先检查以确保该行不存在。它适用于Opsworks,每次停止和启动时,都会运行所有脚本,并在每次启动时将该行附加到此文件。第一个只是列出了没有添加任何东西的文件,第二个就是每次添加它。
awk -v s='/aiw ahost-name02(rw,no_root_squash,sync)' '/^all:/ && $0 !~ s "$" { $0 = $0 OFS s } 1' /etc/export
sed -i.bak '/^\/user @userhosts(rw,no_root_squash,sync,no_subtree_check)$/a /user ahost-name02(rw,no_root_squash,sync)' /etc/export
所以我想附加到现有的行,并检查后续运行,如果出现第二行则不添加。
这是一个AWK解决方案。我将正则表达式匹配运算符~ s "$"
更改为完全匹配== s
:
awk -v s="/aiw ahost-name02(rw,no_root_squash,sync)" '$0 == s { fnd = 1 } 1; END { if (!fnd) print s }' /etc/export > export.tmp && mv export.tmp /etc/export
有点麻烦,但它的工作原理。
另一个AWK解决方案:
如果你仍然喜欢在完全匹配~
上匹配==
的正则表达式,那么你需要从你的变量中正确地准备正则表达式。因为变量s
中的括号在匹配期间将被视为正则表达式语法的一部分,而不是字符。
在这里,我通过变量rgx实现这一点:
awk -v s='/aiw ahost-name02(rw,no_root_squash,sync)' '
BEGIN {
rgx = s;
gsub(/[(]/, "[(]", rgx);
gsub(/[)]/, "[)]", rgx);
}
$0 ~ rgx {
fnd = 1
}
1;
END {
if (!fnd)
print s
}' /etc/export > export.tmp && mv export.tmp /etc/export