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

Небольшой контекст для моего проекта: у нас есть произвольное количество файлов, которым нужен отдельный процесс для каждого файла, а затем нужно искать с помощью вызова exec(), чтобы найти каждый раз, когда используется определенный KEY. Я знаю, как использовать grep из командной строки, используя эту команду:

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

Но я не могу понять, как это сделать на С++. Я нашел здесь тему, которая дала мне эту строку.

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 ... ).

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


person Alex    schedule 06.10.2015    source источник


Ответы (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).

person skyking    schedule 06.10.2015