как найти файлы, содержащие строку, используя egrep - PullRequest
5 голосов
/ 01 сентября 2009

Я хотел бы найти файлы, содержащие определенную строку в Linux. Я пытался что-то вроде, но не удалось:

найти. имя * .txt | egrep mystring

Ответы [ 7 ]

12 голосов
/ 01 сентября 2009

Здесь вы отправляете имена файлов (вывод find command) в качестве ввода в egrep; вы действительно хотите запустить egrep для содержимого файлов.

Вот несколько альтернатив:

find . -name "*.txt" -exec egrep mystring {} \;

или даже лучше

find . -name "*.txt" -print0 | xargs -0 egrep mystring

Проверьте справку команды find , чтобы проверить, что делают отдельные аргументы.
Первый подход будет порождать новый процесс для каждого файла, в то время как второй будет передавать более одного файла в качестве аргумента egrep; флаги -print0 и -0 необходимы для работы с потенциально неприятными именами файлов (например, для правильного разделения имен файлов, даже если имя файла содержит пробел).

2 голосов
/ 01 сентября 2009

попробовать:

find . -name '*.txt' | xargs egrep mystring

В вашей версии есть две проблемы:

Во-первых, , *.txt будет сначала развернут оболочкой, предоставляя вам список файлов в текущем каталоге, заканчивающийся .txt, например, если у вас есть следующее:

[dsm@localhost:~]$ ls *.txt
test.txt
[dsm@localhost:~]$ 

Ваша команда find превратится в find . -name test.txt. Просто попробуйте следующее для иллюстрации:

[dsm@localhost:~]$ echo find . -name *.txt
find . -name test.txt
[dsm@localhost:~]$ 

Во-вторых , egrep не принимает имена файлов из STDIN. Чтобы преобразовать их в аргументы, вам нужно использовать xargs

1 голос
/ 01 сентября 2009

Если вы хотите только имена файлов:

find . -type f -name '*.txt' -exec egrep -l pattern {} \;

Если вы хотите имена файлов и совпадения:

find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \;
1 голос
/ 01 сентября 2009

есть рекурсивная опция из egrep, которую вы можете использовать

egrep -R "pattern" *.log
1 голос
/ 01 сентября 2009

Вот пример, который возвращает пути к файлам для всех *.log файлов, строка которых начинается с ERROR:

find . -name "*.log" -exec egrep -l '^ERROR' {} \;
1 голос
/ 01 сентября 2009

Вы можете использовать

find . -iname *.txt -exec egrep mystring \{\} \;
1 голос
/ 01 сентября 2009
find . -name *.txt | egrep mystring

Это не будет работать, так как egrep будет искать mystring в выходных данных, генерируемых find . -name *.txt, которые являются просто путем к *.txt файлам.

Вместо этого вы можете использовать xargs:

find . -name *.txt | xargs egrep mystring
...