我发现了一些我试过的东西,但没有用。基本上我需要用一行来修改/ 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
所以我想追加现有的行,并检查后续运行,如果出现第二行则不添加。
答案 0 :(得分:0)
这是一个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