Использование 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
).