只有在所有模式匹配时才使grep成功

时间:2018-04-17 13:51:29

标签: grep

如果输出中存在所有指定的模式,我想编写一个成功的简单测试。

具体来说,我正在测试我的程序是否正确使用配置文件进行自我配置。当我只有一个参数时,这工作得很好,但现在我对多个参数做了同样的事情,现在我需要采用不那么快速和肮脏的方式,因为如果任何模式匹配grep成功,而不是所有这些

该计划:

    logger_ << yaaf::LogLevel::info << "intParam is " << get_parameters().intParam << std::endl;
    logger_ << yaaf::LogLevel::info << "boolParam is " << get_parameters().boolParam << std::endl;
    logger_ << yaaf::LogLevel::info << "charParam is " << get_parameters().charParam << std::endl;
    logger_ << yaaf::LogLevel::info << "floatParam is " << get_parameters().floatParam << std::endl;
    logger_ << yaaf::LogLevel::info << "doubleParam is " << get_parameters().doubleParam << std::endl;
    logger_ << yaaf::LogLevel::info << "longParam is " << get_parameters().longParam << std::endl;
    logger_ << yaaf::LogLevel::info << "uintParam is " << get_parameters().uintParam << std::endl;
    logger_ << yaaf::LogLevel::info << "ulongParam is " << get_parameters().ulongParam << std::endl;
    logger_ << yaaf::LogLevel::info << "stringParam is " << get_parameters().stringParam << std::endl;

当前测试:

 timeout 3 ${ini_test} | grep 'intParam is 1'

 timeout 3 ${ini_test} -i ${workspace}/tests/eclipseProject/algos/testsIni/initest.ini | grep 'intParam is 2'

什么行不通:

timeout 3 ${ini_test} | grep -e 'intParam is 1' -e 'boolParam is false' -e 'charParam is a' [and so on...]

不起作用,因为如果任何模式匹配,grep将以代码0退出。我希望它返回0 iff 所有模式可以与输出匹配。

对于这种情况,我可能只是编写一些python代码来做我想要的,但案例可能会在将来再次出现,或者为其他人。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

Grep将为您提供OR个表达式的联合(-e)。您可以通过链接像|grep … |grep … |grep …这样的greps来解决这个问题,但我发现你的表达式都是纯文本而不是正则表达式,所以这里的awk解决方案会更快:

timeout 3 ${ini_test} | awk '
  function in(s) { return index($0, s) }
  in("intParam is 1") && in("boolParam is false") && in("charParam is a") {
    print
    retval = 1
  }
  END { if (retval != 1) exit 1 }
'

我在这里定义了一个函数,使其更清晰(我假设你有很多测试给出你的“等等”注释)。没有这个功能,如何做到这一点应该是非常明显的。

AWK的index(string, substring)为您提供给定substring中的string索引或零(awk字符串不是零索引),因此如果任何请求的子字符串不匹配,index()返回零和条件短路。根据我的经验,AWK的index()grep -F快得多。

AWK总是退出0(true),除非在END节中明确告知其他情况。如果足以停止评估,您可以在另一节的末尾添加额外的exit