在添加之前检查行

时间:2018-02-26 19:56:39

标签: bash awk sed

我发现了一些我试过的东西,但没有用。基本上我需要用一行来修改/ 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

所以我想追加现有的行,并检查后续运行,如果出现第二行则不添加。

1 个答案:

答案 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