text find grep - Как найти все файлы, содержащие определенный текст в Linux?




15 Answers

Вы можете использовать grep -ilR :

grep -Ril "text-to-find-here" /
  • i означает случай игнорирования (необязательно в вашем случае).
  • R означает рекурсивный.
  • l означает «показать имя файла, а не сам результат».
  • / означает начало в корне вашей машины.
примеры поиск текста

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

Когда я смотрел, как это сделать, я дважды сталкивался с этим решением:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Однако это не работает. Кажется, он отображает каждый файл в системе.

Это близко к правильному способу сделать это? Если нет, как мне? Эта возможность находить текстовые строки в файлах будет чрезвычайно полезна для некоторых проектов программирования, которые я делаю.




Ты можешь использовать:

grep -r "string to be searched"  /path/to/dir

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

Или команда, аналогичная той, которую вы пытаетесь (пример:) для поиска во всех файлах javascript (* .js):

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

Это напечатает строки в файлах, где отображается текст, но не печатает имя файла.

В дополнение к этой команде мы также можем написать это: grep -rn «String to search» / path / to / directory / or / file -r: рекурсивный поиск n: номер строки будет показан для совпадений




Список имен файлов, содержащих заданный текст

Прежде всего, я считаю, что вы использовали -H вместо -l . Также вы можете попробовать добавить текст внутри кавычек, а затем {} \ .

find / -type f -exec grep -l "text-to-find-here" {} \; 

пример

Предположим, вы ищете файлы, содержащие определенный текст «Apache License» внутри вашего каталога. Он отобразит результаты, несколько похожие на ниже (вывод будет отличаться в зависимости от содержимого вашего каталога).

bash-4.1$ find . -type f -exec grep -l "Apache License" {} \; 
./net/java/jvnet-parent/5/jvnet-parent-5.pom
./commons-cli/commons-cli/1.3.1/commons-cli-1.3.1.pom
./io/swagger/swagger-project/1.5.10/swagger-project-1.5.10.pom
./io/netty/netty-transport/4.1.7.Final/netty-transport-4.1.7.Final.pom
./commons-codec/commons-codec/1.9/commons-codec-1.9.pom
./commons-io/commons-io/2.4/commons-io-2.4.pom
bash-4.1$ 

Устранение чувствительности к регистру

Даже если вы не используете такой случай, как «текст» и «ТЕКСТ», вы можете использовать ключ -i чтобы игнорировать регистр. Здесь вы можете прочитать дополнительную информацию.

Надеюсь, это вам поможет.




grep ( GNU или BSD )

Вы можете использовать инструмент grep для поиска рекурсивно текущей папки, например:

grep -r "class foo" .

Примечание: -r - Рекурсивно искать подкаталоги.

Вы также можете использовать синтаксис globbing для поиска в определенных файлах, таких как:

grep "class foo" **/*.c

Примечание. Используя опцию globbing ( ** ), он рекурсивно сканирует все файлы с помощью определенного расширения или шаблона. Чтобы включить этот синтаксис, запустите: shopt -s globstar . Вы также можете использовать **/*.* Для всех файлов (за исключением скрытых и без расширения) или любого другого шаблона.

Если у вас есть ошибка в том, что ваш аргумент слишком длинный, рассмотрите сужение поиска или используйте синтаксис find например:

find . -name "*.php" -execdir grep -nH --color=auto foo {} ';'

В качестве альтернативы используйте ripgrep .

ripgrep

Если вы работаете над большими проектами или большими файлами, вы должны использовать ripgrep а именно:

rg "class foo" .

Оформить заказ документов, шагов установки или исходного кода на ripgrep .

Это намного быстрее, чем любой другой инструмент, такой как GNU / BSD grep , ucg , ag , sift , ack , pt или аналогичный, поскольку он построен поверх механизма регулярных выражений Rust, который использует конечные автоматы, SIMD и агрессивные литералы для быстрого поиска ,

Он поддерживает шаблоны игнорирования, указанные в файлах .gitignore , поэтому один путь к файлу может быть сопоставлен с несколькими шаблонами glob одновременно.

Вы можете использовать общие параметры, такие как:

  • -i - Нечувствительный поиск.
  • -I - Игнорировать двоичные файлы.
  • -w - Искать все слова (в отличие от частичного совпадения слов).
  • -n - Показать строку вашего матча.
  • -C / --context (например, -C5 ) - Увеличивает контекст, поэтому вы видите окружающий код.
  • --color=auto - пометить соответствующий текст.
  • -H - отображает имя файла, в котором текст найден.
  • -c - отображает количество совпадающих строк. Может сочетаться с -H .



Пытаться:

find . -name "*.txt" | xargs grep -i "text_pattern"



Появилась новая утилита под названием The Silversearcher

sudo apt install silversearcher-ag

Он тесно работает с Git и другими VCS. Таким образом, вы не получите ничего в .git или другом каталоге.

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

ag -ia "Search query"

И он выполнит эту задачу для вас!




Как найти все файлы, содержащие определенный текст в Linux? (...)

Я наткнулся на это решение дважды:

find / -type f -exec grep -H 'text-to-find-here' {} \;

Если вы используете find в вашем примере, лучше добавьте -s ( --no-messages ) в grep и 2>/dev/null в конце команды, чтобы избежать много сообщений о grep выданных grep и find :

find / -type f -exec grep -sH 'text-to-find-here' {} \; 2>/dev/null

find - стандартный инструмент для поиска файлов - в сочетании с grep при поиске определенного текста - на Unix-подобных платформах. xargs , команда find часто сочетается с xargs .

Для этой же цели существуют более быстрые и простые инструменты - см. Ниже. Лучше попробуйте их, если они доступны на вашей платформе , конечно:

Более быстрые и простые альтернативы

ripgrep - быстрый инструмент поиска:

rg 'text-to-find-here' / -l

Серебряный Искатель :

ag 'text-to-find-here' / -l

ack :

ack 'text-to-find-here' / -l

Примечание. Вы также можете добавить 2>/dev/null к этим командам, чтобы скрыть много сообщений об ошибках.

Предупреждение : если вы действительно не можете этого избежать, не выполняйте поиск из '/' (корневого каталога), чтобы избежать длительного и неэффективного поиска! Поэтому в приведенных выше примерах вам лучше заменить « / » на имя подкаталога, например «/ home», в зависимости от того, где вы действительно хотите выполнить поиск ...




Надеюсь, это поможет ...

Развернув grep немного, чтобы дать больше информации на выходе, например, чтобы получить номер строки в файле, где текст можно сделать следующим образом:

find . -type f -name "*.*" -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searthtext"

И если у вас есть представление о типе файла, вы можете сузить свой поиск, указав расширения типа файла для поиска, в этом случае .pas OR .dfm files:

find . -type f \( -name "*.pas" -o -name "*.dfm" \) -print0 | xargs --null grep --with-filename --line-number --no-messages --color --ignore-case "searchtext"

Краткое описание вариантов:

  1. . в find указывает из текущего каталога.
  2. -name " *.* ": для всех файлов (-name " *.pas " -o -name " *.dfm "): Только файлы *.pas OR *.dfm , или указанные с -o
  3. -type f указывает, что вы ищете файлы
  4. -print0 и --null на другой стороне | (pipe) являются ключевыми, передавая имя файла из find в grep встроенное в xargs , позволяя пропускать имена файлов WITH пробелов в именах файлов, позволяя grep обрабатывать путь и имя файла как одну строку, а не прерывать его на каждом пространстве.



find /path -type f -exec grep -l "string" {} \;

Объяснение из комментариев

find - это команда, которая позволяет находить файлы и другие объекты, такие как каталоги и ссылки в подкаталогах заданного пути. Если вы не укажете маску, с которой должны встречаться имена файлов, она перечисляет все объекты каталога.

-type f specifies that it should proceed only files, not directories etc.
-exec grep specifies that for every found file, it should run grep command, passing its filename as an argument to it, by replacing {} with the filename



Я написал скрипт Python, который делает что-то подобное. Вот как следует использовать этот скрипт.

./sniff.py path pattern_to_search [file_pattern]

Первый аргумент path - это каталог, в котором мы будем искать рекурсивно. Второй аргумент pattern_to_search - это регулярное выражение, которое мы хотим найти в файле. Мы используем формат регулярных выражений, определенный в библиотеке Python re . В этом скрипте . также соответствует новой строке.

Третий аргумент file_pattern является необязательным. Это еще одно регулярное выражение, которое работает с именем файла. Будут рассмотрены только те файлы, которые соответствуют этому регулярному выражению.

Например, если я хочу искать файлы Python с расширением py содержащим Pool( за которым следует слово Adaptor , я делаю следующее:

./sniff.py . "Pool(.*?Adaptor"  .*py
./Demos/snippets/cubeMeshSigNeur.py:146 
./Demos/snippets/testSigNeur.py:259 
./python/moose/multiscale/core/mumbl.py:206 
./Demos/snippets/multiComptSigNeur.py:268 

И voila, он генерирует путь к сопоставленным файлам и номеру строки, по которой было найдено совпадение. Если было найдено несколько совпадений, то каждый номер строки будет добавлен к имени файла.




Использование:

grep -c Your_Pattern *

Это сообщит, сколько копий вашего шаблона присутствует в каждом из файлов в текущем каталоге.




Чтобы искать строку и выводить только эту строку со строкой поиска:

for i in $(find /path/of/target/directory -type f); do grep -i "the string to look for" "$i"; done

например:

for i in $(find /usr/share/applications -type f); \
do grep -i "web browser" "$i"; done

Чтобы отобразить имя файла, содержащее строку поиска:

for i in $(find /path/of/target/directory -type f); do if grep -i "the string to look for" "$i" > /dev/null; then echo "$i"; fi; done;

например:

for i in $(find /usr/share/applications -type f); \
do if grep -i "web browser" "$i" > /dev/null; then echo "$i"; \
fi; done;



Избегайте хлопот и устанавливайте ack-grep. Это устраняет много разрешений и котировок.

apt-get install ack-grep

Затем перейдите в каталог, который вы хотите найти, и выполните команду ниже

cd /
ack-grep "find my keyword"



Все предыдущие ответы предлагают grep и find. Но есть и другой способ: использовать полуночного командира

Это бесплатная утилита (30 лет, проверенная временем), которая визуальна, не являясь графическим интерфейсом. Имеет множество функций, поиск файлов - лишь один из них.




Меня увлекает то, как простой grep делает это с 'rl'

grep -rl 'pattern_to_find' /path/where/to/find

-r to find recursively file / directory inside directories..
-l to list files matching the 'pattern'

Используйте '-r' без 'l', чтобы увидеть имена файлов, за которыми следует текст, в котором найден шаблон !

grep -r 'pattern_to_find' /path/where/to/find

Работает просто отлично ..

Надеюсь, поможет!






Related