Использование grep с execl()

Небольшой контекст для моего проекта: у нас есть произвольное количество файлов, которым требуется отдельный процесс для каждого файла, а затем необходимо выполнить поиск с помощью вызова 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(), предоставив ему путь к исполняемому файлу оболочки (обычно / bin / sh) и, в качестве аргументов / bin / sh, строку -c и строку соответствует команде поиска (grep -o...).

Некоторое руководство здесь будет высоко ценится!

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интерпретировать и запустить его. Обратите внимание, что это будет включать в себя расширение подстановочных знаков и все, что делает оболочка.

Тогда, конечно, если вы не хотите продолжать после его завершения, вам придется fork во-первых, потому что execl не возвращается, если он успешно запустил программу (т.е. bash).

Другие вопросы по тегам