Поиск по сайту:

Поиск файлов, содержащих заданный текст/строку в Linux (примеры)

В этом руководстве показано, как искать и распечатывать файлы, содержащие указанный вами текст или строку, в Ubuntu и других Linux в командной строке, с примерами.

Поиск файла или содержимого файла — важный навык для администратора Linux. Я показал, как использовать командуlocate для поиска файлов по ключевому слову в имени файла, пути и типе файла.

Здесь я собираюсь показать вам, как искать файлы, если вам известен какой-либо текст или строка, которые они содержат.

Способ 1: используйте команду grep

grep — очень популярный инструмент командной строки, который в большинстве Linux включается «из коробки». Я использую его довольно часто для фильтрации содержимого вывода команды.

В моем случае создание приложения иногда работает в последней версии Ubuntu, но НЕ в старой версии Ubuntu. Он выводит ошибку «не имеет члена или класса с именем «xxxxxx»». Мне нужно выяснить, какой файл содержит этот член/класс в последней версии Ubuntu, и выполнить перенос на более старую версию Ubuntu.

1. В этом случае я могу запустить приведенную ниже команду, например, для поиска файлов в каталоге /usr/include, которые содержат строку GParamSpecClass в содержимом файла< /б>.

grep -lr "GParamSpecClass" /usr/include/

Здесь вы можете заменить строку и каталог поиска соответственно или пропустить /usr/include/ для поиска в текущем рабочем каталоге.

И параметры команды:

  • -l или --files-with-matches означает печать только имен файлов, содержащих совпадения.
  • -r или --recursive также выполняет поиск в подпапках данного каталога.

Как вы знаете, Linux чувствителен к регистру. Чтобы игнорировать, используйте в команде -i или --ignore-case. Итак, команды ниже работают так же, как и предыдущие:

grep -lir "gparamspecclass" /usr/include/
grep -lir "GPARAMSPECclass" /usr/include/

2. По выбору вы можете печатать имена файлов, совпадающие строки, а также номера строк файлов, содержащих «GParamSpecClass» в /usr/include/, выполнив аналогичную команду ниже:

grep -irn "GParamSpecClass" /usr/include/

Как видите, в команде:

  • Пропустите -l или --files-with-matches, затем на выходе будут выведены совпадающие строки.
  • Добавьте -n или --line-number, также будут показаны номера строк.

3. Чтобы отобразить больше содержимого файла, вы можете добавить:

  • -A NUM или --after-context=NUM для печати ЧИСЛА строк конечного контекста после совпадающих строк.
  • -B NUM или --before-context=NUM для печати ЧИСЛА строк начального контекста перед совпадающими строками

Например, выполните поиск файлов в каталоге /usr/include, которые содержат строку «g_cclosure_marshal_generic», распечатайте имена файлов, совпавшие строки, а также 2 строки до и 4 строки после совпадений. .

grep -irn -B 2 -A 4 "g_cclosure_marshal_generic" /usr/include/

Иногда тому, что вы ищете, может соответствовать несколько файлов или несколько строк. В этом случае вы можете добавить -m NUM или --max-count=NUM для поиска первых совпадений NUM.

Например, команда ниже будет делать то же самое, что и предыдущая, но покажет только первую соответствующую команду.

grep -irn -m 1 -B 2 -A 4 "g_cclosure_marshal_generic" /usr/include/

grep поддерживает выражения регулярных выражений, что делает поиск более гибким. Вместо того, чтобы вводить точную строку или текст, который вы хотите найти, вы можете использовать «^string» для поиска файлов, содержащих строку в начале строк, используйте «string $” для поиска файлов, содержащих строку в конце строк, или stringA|stringB для поиска файлов, содержащих либо stringA, либо stringB .

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

Способ 2. Используйте команду ag.

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

1. Сначала запустите команду для установки ag.

  • Для Debian, Ubuntu, Linux Mint используйте команду:

    sudo apt install silversearcher-ag
  • Для Fedora, RHEL и т. д. выполните команду:

    sudo dnf install the_silver_searcher
  • В то время как системы на базе Arch могут использовать вместо этого команду ниже:

    sudo pacman -S the_silver_searcher

2. Затем, например, ищите файлы в /usr/include, содержащие строку «gparamspecclass»:

ag "gparamspecclass" /usr/include

Как показано на скриншоте, он печатает все имена файлов, строки и номера строк, которые совпадают. И это нечувствительно к регистру.

Команда ag работает очень быстро! Если параметры по умолчанию не соответствуют вашим потребностям, вот некоторые из них, похожие на grep:

  • -A NUM или -после NUM, вывести ЧИСЛО строк после совпадений.
  • -B NUM или -before NUM, выводит ЧИСЛО строк перед совпадениями.
  • -c или --count, выводит только имена файлов и количество совпадений.
  • -m NUM или --max-count NUM, вывести только первые совпадения NUM.
  • -f или --follow, а также искать файлы, ссылающиеся на другие файлы за пределами каталога поиска.
  • -l или --files-with-matches выводит только имена файлов, содержащих совпадения.

Например, выполните поиск «gparamspecclass» в текущем каталоге и отобразите только имена файлов и количество совпадений.

ag "gparamspecclass" -c

Или найдите и распечатайте первое совпадение, а также 2 строки до и 4 строки после строк совпадения.

ag -m 1 -A 4 -B 2 "gparamspecclass"

ag по умолчанию исключает файлы, перечисленные в .gitignore и .hgignore в каталоге поиска, и пользователь может вручную добавлять исключения, создавая и добавляя их. в файл .ignore.

Чтобы также выполнить поиск по файлам, упомянутым ранее, используйте опцию -a для поиска по всем (исключить скрытые файлы) или --hidden для поиска скрытых файлов. Дополнительную информацию см. в разделе man ag.