Для вашего конкретного примера вы можете сделать это:
find . -type f -name "*.txt" -exec grep FirstKeyWord {} \; | grep "SecondKeyWord"
Кстати, это также может быть сделано без использования второго grep. Вместо этого используйте egrep
с двумя альтернативами FirstKeyWord
за которыми следует SecondKeyWord
или SecondKeyWord
а затем FirstKeyWord
:
find . -type f -name "*.txt" -exec egrep "FirstKeyWord.*SecondKeyWord|SecondKeyWord.*FirstKeyWord" {} \;
Если вы можете дать некоторые гарантии относительно результирующих имен путей из find
(например, без начальных или внутренних пробелов и без новых строк в путевых именах), вы также можете сделать это следующим образом:
find . -type f -name "*.txt" -print | while read filename; do grep "FirstKeyWord" "${filename}" | grep "SecondKeyWord"; done
Более общий ответ «вы не можете» непосредственно из find
. Передача команд или использование &&
или ||
это функция оболочки, а не функция выполнения процессов.
Я использовал этот шаблон раньше, но он хрупкий и более сложный:
find . -type f -name "*.txt" -print \
| sed -e 's;[\\$"`!];\\&;g' \
-e 's;^.*$;grep "FirstKeyWord" "&" | grep "SecondKeyWord";' \
| sh
Распечатайте каждое имя файла, используйте sed
чтобы преобразовать его в сценарий оболочки на лету (старайтесь избегать символов в имени файла, которые могут вызвать проблемы при заключении в двойные кавычки оболочки), затем пропустите результат через оболочку.
Другое решение - создать сценарий оболочки, который выполняет вашу обработку, и вызвать этот сценарий оболочки из find:
$ cat grepit.sh
#!/bin/sh
grep "FirstKeyWord" "$1" | grep "SecondKeyWord"
$ find . -type f -name "*.txt" -exec sh grepit.sh {} \;