Найти в Дзене
Калейдоскоп эмоций

Поиск файлов по содержимому в Linux

Иногда может понадобиться найти файл, в котором содержится определённая строка или найти строку в файле, где есть нужное слово. Это может понадобиться для поиска логов, поиска конфигурационных файлов, если вы не знаете где они находятся или для поиска файлов с программным кодом. Раньше для этих целей использовалась только утилита grep, однако сейчас существует огромное количество других программ, которые могут делать это быстрее и предоставляют более удобный интерфейс. В этой статье мы рассмотрим самые интересные из них и несколько примеров как ими пользоваться. Все утилиты в этой статье работают только в терминале. Если вас интересуют приложения с графическим интерфейсом, посмотрите статью поиск файлов в Linux. Большинство описанных ниже команд имеют примерно одинаковый синтаксис: $ команда опции паттерн /путь/к/папке Паттерн для поиска может быть обычным словом, но большинство команд ожидают, что это будет регулярное выражение, поэтому если в вашем запросе есть спец. символы, вы може
Оглавление

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

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

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

$ команда опции паттерн /путь/к/папке

Паттерн для поиска может быть обычным словом, но большинство команд ожидают, что это будет регулярное выражение, поэтому если в вашем запросе есть спец. символы, вы можете получить в результате не то, что ожидаете. Путь к папке, как правило, указывать не обязательно, тогда команды используют текущую папку для поиска. А теперь давайте рассмотрим каждую команду подробнее.

1. Grep

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

По умолчанию grep фильтрует один файл или стандартный ввод. Для того чтобы выполнять поиск в папке по нескольким файлам, нужно включить рекурсивный поиск с помощью опции -r. Например, найдем все файлы в папке /etc/, которые содержат строку root:

sudo grep -r "root" /etc/

Команда grep не подсвечивает вхождения символов которое вы искали цветом, для этого можно использовать опцию --color=always. Но в большинстве дистрибутивов эта опция уже прописана в алиасе для этой команды, поэтому вывод будет выглядеть вот так:

sudo grep --color=always -r "root" /etc/

-2

С помощью опции или --context вы можете включить отображение не только текущей строки, в которой было найдено вхождение но и нескольких строк до и после. В этом параметре надо указать количество строк для отображения:

sudo grep -r -С2 "root" /etc/

-3

По умолчанию grep ожидает, что поисковый запрос может быть регулярным выражением, но поддерживается только базовый синтаксис. Для включения расширенного синтаксиса нужно использовать опцию -E. Например, для того чтобы найти все файлы содержащие переменные, начинающиеся на букву A в папке /etc/ выполните:

sudo grep -r -E "^A[A-Z_]+\=" /etc/

-4

А для того чтобы искать именно фиксированную строку, а не регулярное выражение используйте опцию -F или команду fgrep. Например, так можно найти все файлы содержащие секцию [Install] в папке /usr/:

sudo grep -r -F "[Install]" /usr/

-5

2. Ripgrep

Это популярная альтернатива grep написанная на Rust. Она может делать всё то же самое что и grep, но быстрее, а ещё её гораздо удобнее использовать. Рекурсивный поиск включён по умолчанию, и подсветка вхождений и имени файла разными цветами тоже работает без дополнительных опций, а также она пропускает скрытые файлы, бинарные файлы и файлы, перечисленные в .gitignore. Для установки ripgrep в Ubuntu используйте такую команду:

sudo apt install ripgrep

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

sudo rg root /etc/passwd

-6

Если же передать папку, то команда будет искать во всех файлах, которые находятся в этой папке. По умолчанию используется текущая папка. Например, для того чтобы найти все файлы, содержащие слово "root" в каталоге /etc/ используйте такую команду:

sudo rg root /etc/

-7

Также, как и при использовании grep, можно отобразить не только строку со вхождением но и несколько строк до и после. Например, по две:

sudo rg -C2 root /etc/

-8

А вот полный синтаксис регулярных выражений здесь работает по умолчанию. Например:

sudo rg "^A[A-Z_]+=" /etc/

-9

Если же вы хотите указать что надо искать именно строку, а не регулярное выражение, используйте опцию -F:

sudo rg -F "[Install]" /usr/

-10

3. Ack

Если вам нужно найти файл с исходным кодом зная строку, которая в нём есть, то для этого существуют более подходящие утилиты чем grep. Например, ack. Она появилась уже довольно давно и предназначена именно для работы с исходным кодом. Кроме всех возможностей grep она позволяет пропускать файлы резервных копий, внутренние файлы репозиториев .git и .svn, а также дампы памяти. Кроме того, вы можете выбрать типы файлов, в которых будет выполняться поиск и даже указать определённую часть файла. Для установки программы в Ubuntu используйте такую команду:

sudo apt install ack

Самый простой пример - поиск всех файлов содержащих слово root в папке /etc/:

sudo ack "root" /etc/

Или же регулярное выражение, как в предыдущем разделе для поиска файлов с переменными, начинающимися на букву A:

sudo ack "^A[A-Z_]+=" /etc/

-11

Для того чтобы вывести не только строку с вхождением, но и строки до и после неё используйте опцию -C. По умолчанию выводится по две строки:

sudo ack -C "root" /etc/

-12

Команда ack позволяет указать тип файлов, в которых надо выполнять поиск. Это очень удобно для поиска по исходникам. Вы можете выбрать только исходные файлы Си, JavaScript или PHP и так далее. Все доступные типы файлов можно посмотреть с помощью команды:

ack --help-types

-13

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

sudo ack --type=xml "root" /etc/

-14

Ещё одна интересная возможность утилиты ack - настройка частей файла, в которых будет выполняться поиск с помощью регулярного выражения. Для этого предназначены опции --range-start и --range-end и это будет работать как в рамках одной строки так и в рамках всего файла. Например, для поиска только в комментариях XML файлов можно использовать такую команду:

sudo ack --type=xml --range-start="\<\!\-\-" --range-end="\-\-\>" "root" /etc/

-15

4. Silver Searcher

На данный момент это одна из самых популярных программ для поиска текста по файлам в Linux. Она была спроектирована в качестве альтернативы для ack, как инструмент для поиска кода. В дополнение к основным возможностям ack, она значительно быстрее и учитывает настройки исключений из файлов .gitignore и .hgignore. Для установки программы в Ubuntu используйте такую команду:

sudo apt install silversearcher-ag

Рассмотрим тот же пример, что и в предыдущих разделах. Для того чтобы найти все файлы содержащие слово root в папке /etc/ выполните:

sudo ag "root" /etc/

-16

Аналогично grep и ripgrep, ag ожидает регулярное выражение в качестве паттерна поиска, поэтому вы можете использовать его без каких либо дополнительных опций. Например:

sudo ag "^A[A-Z_]+=" /etc/

-17

Но если вы хотите чтобы поисковый запрос рассматривался именно как строка, используйте опцию -Q. Например, для поиска всех файлов, содержащих секцию [Install] в папке /usr/ выполните:

sudo ag -Q "[Install]" /usr/

-18

Здесь тоже можно вывести несколько строк до и после строки со вхождением с помощью опции .

В отличие от grep и ripgrep, команда ag позволяет указать тип файлов в которых вы хотите выполнять поиск. Посмотреть все доступные типы файлов можно с помощью такой команды:

ag --list-file-types

-19

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

sudo ag --ini "root" /etc/

-20

Утилита также позволяет использовать регулярное выражение для фильтрации файлов по имени перед тем как выполнять поиск по содержимому. Для этого нужно использовать опцию -G. Например для того чтобы выполнять поиск только по файлам, имя которых заканчивается на conf, выполните:

sudo ag -G .*\.conf$ root /etc/

-21

5. Skim

Это ещё одна интересная утилита для нечеткого поиска в реальном времени, написанная на Rust. По умолчанию она ищет файлы по имени, но её можно использовать вместе с одной из выше перечисленных утилит для поиска файлов по содержимому в реальном времени. Пакета с программой пока нет в официальных репозиториях, но вы можете установить её с помощью cargo:

cargo install skim

Команда выполняет поиск только в текущей папке и указать другую папку нельзя, поэтому нужно сначала перейти в нужную папку используя команду cd. Например:

cd /etc/

Затем используйте такую команду для того чтобы объединить sk с Silver Searcher для фильтрации файлов по содержимому:

sk --ansi -i -c 'ag --color "{}"'

Здесь опция --ansi включает отображение цветов, -i включает интерактивный режим, а опция -c задает команду, которая будет выполнена при вводе какого-либо запроса, строка {} будет заменена на то, что вы введете при поиске. Просто выполните команду и начинайте вводить слово которое хотите искать:

-22

Дальше вы можете использовать все функции фильтрации нечеткого поиска для обработки результатов.

Выводы

В этой статье были рассмотрены самые часто используемые утилиты для поиска файлов по содержимому и поиска текста в файлах в Linux. Как видите, существует достаточно инструментов чтобы было из чего выбрать. Все команды довольно похожие, но каждая из них имеет свои особенности. А что используете вы? Напишите в комментариях!

Источник

#linux #комманднаястрока #поиск #справочник #команда #grep #ripgrep #ask #skim