2015-10-06 4 views
0

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

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

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

+1

http://stackoverflow.com/questions/20488574/output-redirection-using-fork-and-execl –

+0

Вы представляете свой выходной файл в качестве входного файла. Вы хотите перенаправить вывод grep. Вы должны прочитать ссылку выше, чтобы посмотреть, как это сделать. –

+0

Таким образом, ваш проект * специально упоминает *, что вы * не * выполняете 'grep' напрямую. И что ты делаешь? Вы выполняете 'grep' напрямую. И когда это не работает, все еще вместо того, чтобы читать указания вашего проекта, вы спрашиваете здесь. Пожалуйста, ознакомьтесь с указаниями вашего проекта. – hvd

ответ

0

Для фактического исполнения, как вы могли бы сделать в командной строке будет:

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

Это будет означать, что оболочка будет считать линию grep -o KEY FILENAME.txt | wc -l > OUTPUT.txt, интерпретировать его и запустить его. Обратите внимание, что это будет включать расширение дикой карты и все, что делает оболочка.

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

+0

Спасибо, skyking! – Alex

Смежные вопросы