Как использовать команду «grep» для поиска текста, включая подкаталоги

Я хочу найти все файлы, содержащие определенную строку текста. Команда grep работает, но я не знаю, как ее использовать для каждого каталога (я могу сделать это только для моего текущего каталога). Я пробовал читать man grep , но он не дал никакой помощи.

285 голосов | спросил Smile.Hunter 1 PM00000030000001531 2011, 15:38:15

11 ответов


370

Лучше использовать

  grep -rl "string" /path
 

где

  • Параметр -r (или - recursive ) используется для перемещения также всех подкаталогов /path , тогда как
  • -l (или - files-with-matches ) используется для печати только файлов совпадающих файлов, а не соответствующих строк (это также может улучшить скорость, что grep перестает читать файл в первом совпадении с этой опцией).
ответил enzotib 1 PM00000030000003231 2011, 15:55:32
134

Если вы ищете соответствие строк в файлах, моя любимая команда:

  grep -Hrn 'search term' path /to /files
 
  • -H заставляет печатать имя файла (подразумевается при поиске нескольких файлов)
  • -r выполняет рекурсивный поиск
  • -n заставляет напечатать номер строки

путь /в /файлы может быть . для поиска в текущем каталоге

Другие варианты, которые я нахожу очень полезными:

  • -I игнорировать двоичные файлы (дополнение: -a обрабатывать все файлы как текст)
  • -F рассматривает термин поиска как литерал, а не регулярное выражение
  • -i выполняет поиск без учета регистра
  • - color = always , чтобы заставить цвета даже при прохождении через меньше . Чтобы добавить цвета less , вам нужно использовать опцию -r :

      grep -Hrn search. | меньше -r
     
  • - exclude-dir = dir полезно для исключения таких каталогов, как .svn и .git .

Пример вывода

ответил Lekensteyn 1 PM00000040000002131 2011, 16:27:21
21

Я считаю, вы можете использовать что-то вроде этого:

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

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

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

  • -type f указывает, что он должен обрабатывать только файлы, а не каталоги и т. д.
  • -exec grep указывает, что для каждого найденного файла он должен запускать команду grep, передавая ему имя файла в качестве аргумента, заменяя {} на имя файла
  • >
ответил dmityugov 1 PM00000030000000931 2011, 15:48:09
17

Моя команда по умолчанию

  grep -Rin string *
 

Я использую capitol 'R', потому что ls использует его для рекурсивного. Поскольку grep принимает оба, нет причин не использовать его.

EDIT: для HVNSweeting, очевидно, -R будет следовать символическим ссылкам, где -r не будет.

ответил user606723 1 PM00000060000005431 2011, 18:43:54
11

Если вы хотите попробовать что-то новое, дайте ack выстрел. Команда для рекурсивного поиска текущего каталога для string :

  строка ack
 

Установка довольно проста:

  curl http://betterthangrep.com/ack-standalone> ~ /bin /ack & amp; & amp; & amp; chmod 0755! #: 3
 

(Если у вас уже есть каталог ~ /bin , и он предпочтительно находится в вашем PATH .)

ответил Konrad Rudolph 1 PM00000070000005631 2011, 19:09:56
3

Команда rgrep предназначена для такой необходимости

Если это невозможно, вы можете получить его так:

  mkdir -p ~ /bin
cd ~ /bin
wget http://sdjf.esmartdesign.com/files/rgrep
chmod + x rgrep
 

Вы можете напрямую установить в свои параметры grep по умолчанию, как описано выше.

Я использую

  [[$ {# args} -lt 5 & amp; & amp; & amp; "$ {args //[[: space:]] /}" == "-i"]] & amp; & amp; & amp; & amp; & amp; & amp; Args = "- Hin"
args = "$ {args: - Hns} --color = auto"
 

связанная тема: как всегда использовать rgrep с цветом

ответил mnono 2 Jpm1000000pmFri, 02 Jan 2015 16:58:03 +030015 2015, 16:58:03
2

Обновление 2:

Эта строка команд с использованием find и grep устраняет проблему:

  $ find path_to_search_in -type f -exec grep -in searchString {} 2> /dev /null +
 

- color = <always или auto> для цветного вывода:

  $ find path_to_search_in -type f \
            -exec grep --color = always -in searchString {} 2> /dev /null +
 

Пример:

  $ find /tmp /test /-type f -exec grep --color = auto -in "Строка поиска" {} 2> /dev /null +
 

Пример, приведенный ниже: snap1


Обновление 1:

Вы можете попробовать следующий код; как функция в вашем .bashrc или .bash_aliases или в скрипте:

 , где ()
{
    для i в $ (найти «$ 1» -тип f 2> /dev /null);
    делать
        если grep --color = auto -i "$ 2" "$ i" 2> /DEV /нуль; тогда
            echo -e "\ 033 [0; 32mFound in: $ i \ 033 [0m \ n";
        Fi;
    сделанный
}
 

Использование: где /path /to /search /in /searchkeyword

Пример:

  $ где ~ /Documents /"hello world"
 

(Примечание. Как было предложено в комментариях ниже @enzotib, это не работает с файлами /каталогами, включая пробелы в их именах.)


Оригинальное сообщение

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

  $ для i в $ (find /path /of /target /directory -type f); делать \
    grep -i "строка для поиска" "$ i"; сделанный
 

например:.

  $ for i in $ (find /usr /share /applications -type f); \
    do grep -i "веб-браузер" "$ i"; сделанный
 

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

  $ для i в $ (find /path /of /target /directory -type f); делать \
    если grep -i "строка для поиска" "$ i"> /DEV /нуль; затем echo «$ i»; Fi; сделанный;
 

например:.

  $ for i in $ (find /usr /share /applications -type f); \
    do, если grep -i "веб-браузер" "$ i"> /DEV /нуль; затем echo «$ i»; \
    Fi; сделанный;
 
ответил precise 25 Jpm1000000pmSat, 25 Jan 2014 15:11:45 +040014 2014, 15:11:45
1

Я делаю это с помощью xargs, очень недооцененной команды

  find ./-type f -print0 | xargs -0 grep 'string_you_are_looking_for'
 

find ./дает вам рекурсивный список всех файлов в текущей папке то вы передаете его в xargs, который выполняет команду grep для каждого из этих файлов.

ответил deadprogrammer 1 PM00000070000005531 2011, 19:30:55
0

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

  find. -type f -exec grep --quiet string_to_look_for {} ';' -Распечатать
 

Это работает, потому что grep возвращает 0, если он нашел результат, 1 в противном случае. Например, вы можете найти файлы размером 1 МБ и , содержащие что-то:

  find. -type f -exec grep --quiet string_to_look_for {} ';' -размер 1M -print
 

Для нескольких требований вы, вероятно, захотите использовать флаг оптимизатора -O , который существует в GNU grep.

ответил Ztyx 11 MarpmWed, 11 Mar 2015 16:56:52 +03002015-03-11T16:56:52+03:0004 2015, 16:56:52
0

Скрипт (find-in-code) для поиска в C, CPP-коде:

  #! /Bin /ш

найти . \ (-iname "* .c" -o -iname "* .cpp" -o -iname "* .h" \) -type f -print0 | xargs -0 grep --color -n "$ 1"
 

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

  find-in-code "строка поиска"
 
ответил nvd 11 J0000006Europe/Moscow 2015, 19:49:50
0

grep ( GNU или BSD )

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

  grep -r "pattern".
 

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

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

  grep "class foo" ** /*. c
 

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

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

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

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

ripgrep

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

  rg "pattern".
 

Ознакомьтесь с документами, этапами установки или исходным кодом на странице проекта GitHub .

Это намного быстрее, чем любой другой инструмент, например GNU / BSD < код> grep , ucg , < a href = "https://github.com/ggreer/the_silver_searcher" rel = "nofollow noreferrer"> ag , sift , ack , pt или аналогичный, поскольку он построен поверх механизма регулярных выражений Rust , который использует конечные автоматы, SIMD и агрессивные литералы для оптимизации заставлять ching очень быстро.

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


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

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

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132