Поиск файлов, содержащих заданный текст/строку в 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
.