【问题标题】:Using grep with execl()将 grep 与 execl() 一起使用
【发布时间】:2015-10-06 10:30:06
【问题描述】:

我的项目的一个小背景:我们有任意数量的文件,每个文件需要一个单独的进程,然后需要使用 exec() 调用进行搜索,以在每次使用特定 KEY 时查找。我知道如何使用这个命令从命令行使用 grep:

grep -o KEY FILENAME.txt | wc -l > OUTPUT.txt

但我不知道如何在 C++ 中做到这一点。我在这里找到了一个线程,它给了我这条线。

execl("/bin/grep","grep",pattern,filename,NULL);

它编译并运行,所以我认为它可以工作,但问题是我需要将模式发生的次数输出到文件中,我尝试了下面的行,但预期它不起作用。它给出了这个错误“grep:out.txt:没有这样的文件或目录”

execl("/bin/grep", "grep",pattern,fileName,output,NULL);

这是我项目这一部分的方向。

您可以通过 系统调用 exec() ,为其提供 shell 可执行文件的路径(通常是 /bin/sh ) 并且,作为 /bin/sh 的参数,字符串 -c 和与搜索命令对应的字符串 ( grep -o ... )。

非常感谢这里的一些指导!

【问题讨论】:

  • 您将输出文件列为输入文件。你想要的是重定向 grep 的输出。您需要阅读上面的链接以了解如何操作
  • 所以你的项目特别提到直接执行grep。还有你做什么的?你直接执行grep。当它不起作用时,您仍然可以在此处询问,而不是阅读您的项目说明。请阅读您的项目说明。
  • 谢谢 A.S.H. hvd,你没有任何帮助。

标签: c++ c shell grep execl


【解决方案1】:

对于您在命令行上执行的实际执行将是:

 execl("/bin/sh", "/bin/sh", "-c", "grep -o KEY FILENAME.txt | wc -l > OUTPUT.txt")

这意味着外壳程序将采用grep -o KEY FILENAME.txt | wc -l > OUTPUT.txt 行,解释它并运行它。请注意,这将包括通配符扩展和 shell 的所有功能。

当然,如果你不想在它完成后继续,你必须先fork,因为如果它成功启动程序,execl 不会返回(即bash)。

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2014-03-08
    • 2018-03-17
    • 2015-05-03
    相关资源
    最近更新 更多