Как найти текст во всех файлах linux

Делайте так:

grep -rnw '/путь/к/папке/с/файлами' -e "шаблон"
  • -r или -R — рекурсивный поиск.
  • -n — вывод номера строки.
  • -w — только целые слова.
  • -l (нижний регистр от L) — вывод имени файла, где было совпадение.

Эффективности добавят следующие флаги:

  • --exclude — Шаблон для исключения файлов, например: поиск везде, кроме файлов с расширением .o:

     grep --exclude=*.o -rnw '/путь/к/папке/с/файлами' -e "шаблон"
    
  • --include — Поиск только в определённых файлах, например: только в файлах с расширениями .h и .c:

     grep --include=*.{c,h} -rnw '/путь/к/папке/с/файлами' -e "шаблон"
    
  • --exclude-dir и --include-dir — то же, только для выборки директорий, например: исключить папки один, two и любые, начинающиеся на а:

     grep --exclude-dir={один,two,а*} -rnw '/путь/к/папке/с/файлами' -e "шаблон"
    

Это отлично работает для подобных целей, остальные настройки для grep можно узнать, выполнив man grep.


При формировании ответа использовался ответ на вопрос «How do I find all files containing specific text on Linux?» от участника @rakib.

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

Раньше для этих целей использовалась только утилита 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/

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

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

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

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

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

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

2. Ripgrep

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

sudo apt install ripgrep

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

sudo rg root /etc/passwd

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

sudo rg root /etc/

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

sudo rg -C2 root /etc/

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

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

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

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

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/

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

sudo ack -C "root" /etc/

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

ack --help-types

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

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

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

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

4. Sliver Searcher

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

sudo apt install silversearcher-ag

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

sudo ag "root" /etc/

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

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

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

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

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

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

ag --list-file-types

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

sudo ag --ini "root" /etc/

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

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

5. Skim

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

cargo install skim

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

cd /etc/

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

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

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

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

Производительность grep, rg, ack и ag

Перед завершением статьи хочу привести небольшой тест производительности выше перечисленных утилит для поиска текста по файлам в Linux. Я скачал и распаковал исходники ядра Linux версии 6.2.10, а затем использовал каждую из утилит для того чтобы найти все файлы, которые содержат слово ext4 и btrfs. Между разными утилитами система перезагружалась, для того чтобы исключить влияние кэша. Вот результаты:

Команда Время, с Команда Время, с
grep -r ext4 ./ 23.167 grep -r btrfs ./ 3.860
rg ext4 ./ 27.164 rg btrfs ./ 1.387
ack ext4 ./ 36.141 ack btrfs ./ 7.206
ag ext4 ./ 24.594 ag btrfs ./ 3.158

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

Выводы

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

Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.

Creative Commons License

Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна .


Posted:
September 23, 2022

Searching for patterns of text in files or text streams is one of the most common tasks you’ll perform in your sysadmin career. This is a valuable skill that allows you to check a variety of system configurations, analyze data, troubleshoot logs, and perform many other activities.

The most common way to find text in a Linux system is using the command-line utility grep. This utility was originally developed for the Unix operating system in the early 1970s. Grep evolved over the years, and the most common version available today for Linux, GNU grep, has additional features such as colored output. However, its main functionality is still the same.

Using grep, you can quickly find text matching a regular expression in a single file, a group of files, or text coming from stdin using the shell pipe operator.

This article covers how to use the grep command to find text.

Find text in a file

The most basic way to use grep is searching for text in a single file. To do this, type grep followed by the text pattern to search for and the file name to search in. For example, to find which port the Secure Shell (SSH) daemon uses, search for Port in file /etc/ssh/sshd_config:

$ grep Port /etc/ssh/sshd_config
Port 22
#GatewayPorts no

Notice that grep finds all lines that match the text pattern regardless of where the pattern is located.

[ Download the Linux grep command cheat sheet. ]

Extend grep with regular expressions

In the previous example, when you searched for Port in the SSH configuration file, grep returned two lines. The line you were looking for, Port 22, and an additional line containing the search pattern. In some cases, that’s exactly what you want. In other cases, grep could find too many entries that you’re not interested in, requiring you to sort through them to find the desired information.

To avoid that, you can use regular expressions to be more specific about what you’re looking for. For example, to find only lines that start with the word Port, you can use the regular expression operator ^, like this:

$ grep ^Port /etc/ssh/sshd_config
Port 22

This time grep returned only the line that started with Port since, in the second line, the expression Port is in the middle.

You can also use extended regular expressions with the command-line parameter -E. For example, to search for a pattern that contains the word Port followed by numbers, use this regular expression:

$ grep -E "Port [1-9]+" /etc/ssh/sshd_config
Port 22

You can also look for lines that end with a text pattern by using the $ operator. For example, to find all lines that end with none in sshd_config, use grep like this:

$ grep none$ /etc/ssh/sshd_config
#RekeyLimit default none
#AuthorizedPrincipalsFile none
#AuthorizedKeysCommand none
#ChrootDirectory none
#VersionAddendum none
#Banner none

Regular expressions are a big part of grep, making it powerful and flexible. However, regular expressions are a huge topic. For additional information, look at Regular expression on Wikipedia or Regular expressions 101.

Find text in multiple files and directories

Similar to finding text patterns in a single file, you can use grep to find text in multiple files or directories. To find text in multiple files simultaneously, specify which files to search from after the first file name, or use a shell wildcard such as * for all files. For example, to search for a configuration in two files:

$ grep Port /etc/ssh/sshd_config /etc/ssh/ssh_config
/etc/ssh/sshd_config:Port 22
/etc/ssh/sshd_config:#GatewayPorts no
/etc/ssh/ssh_config:#   Port 22

When you use multiple files, grep shows the name of the file where it found a match before showing the matched line.

[ Keep your most commonly used commands handy with the Linux commands cheat sheet. ]

To run the search recursively in multiple subdirectories, use the command line flag -R:

$ grep -R ^Port /etc
/etc/ssh/sshd_config:Port 22

The grep command is fast and returns results quickly, but it may take a long time if you specify too many files or subdirectories to search.

Find text in another command’s output

Similar to other Unix utilities, grep also acts on stdin when you pipe the output of another command into it. This is a fast and useful way to filter a command’s output to match the text pattern you’re looking for.

For example, if you want to check whether the package openssh is installed in your Fedora or Red Hat Enterprise Linux (RHEL) operating system, you can pipe the output of command rpm -qa, which lists all installed packages, into grep to search for the pattern:

$ rpm -qa | grep ssh
libssh-config-0.9.6-4.fc36.noarch
libssh-0.9.6-4.fc36.x86_64
openssh-8.8p1-1.fc36.1.x86_64

You can filter long command outputs with grep, making finding useful information easier.

[ Get the guide to installing applications on Linux. ]

Additional useful options

The grep command provides many options to change how it searches for patterns or displays results. So far in this article, you’ve seen some of them. While I can’t list all options, here are some other useful examples:

  • Use option -i for a case-insensitive search.

  • Use option -v to invert the search and display lines that do not match the pattern.
  • Use option -w to search for entire words only instead of patterns in the middle of other words.
  • Use option --color for colored output, making it easier to spot the matched pattern.

For a complete list of grep options, consult the man pages.

What’s next?

The GNU grep utility is flexible and useful, helping you accomplish many tasks in your daily sysadmin activities. The more you use grep, the more comfortable you will become, and soon you’ll notice you’re relying on it all the time.

For more information about grep, look at some of these links:

  • How to use grep
  • Linux grep command cheat sheet
  • Grep wiki
  • Grep manual at GNU

You can also find more information about grep in your Linux system by using man grep or quick, valuable examples with the tldr tool.

Команда grep означает «печать глобального регулярного выражения», и это одна из самых мощных и часто используемых команд в Linux.

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

В этой статье мы покажем вам, как использовать команду grep на практических примерах и подробных объяснениях наиболее распространенных опций GNU grep .

Командный синтаксис grep

Синтаксис команды grep следующий:

grep [OPTIONS] PATTERN [FILE...]

Пункты в квадратных скобках необязательны.

  • OPTIONS — Ноль или более вариантов. Grep включает ряд опций , управляющих его поведением.
  • PATTERN — Шаблон поиска.
  • FILE — Ноль или более имен входных файлов.

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

Искать строку в файлах

Наиболее простое использование команды grep — поиск строки (текста) в файле.

Например, чтобы отобразить все строки, содержащие строку bash из файла /etc/passwd , вы должны выполнить следующую команду:

grep bash /etc/passwd

Результат должен выглядеть примерно так:

root:x:0:0:root:/root:/bin/bash
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

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

grep "Gnome Display Manager" /etc/passwd

Инвертировать соответствие (исключить)

Чтобы отобразить строки, не соответствующие шаблону, используйте параметр -v (или --invert-match ).

Например, чтобы распечатать строки, не содержащие строковый nologin вы должны использовать:

grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash
colord:x:124:124::/var/lib/colord:/bin/false
git:x:994:994:git daemon user:/:/usr/bin/git-shell
linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Использование Grep для фильтрации вывода команды

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

Например, чтобы узнать, какие процессы выполняются в вашей системе как пользовательские www-data вы можете использовать следующую команду ps :

ps -ef | grep www-data
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
root     18272 17714  0 16:00 pts/0    00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

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

ps -ef | grep www-data | grep -v grep
www-data 18247 12675  4 16:00 ?        00:00:00 php-fpm: pool www
www-data 31147 12770  0 Oct22 ?        00:05:51 nginx: worker process
www-data 31148 12770  0 Oct22 ?        00:00:00 nginx: cache manager process

Рекурсивный поиск

Для рекурсивного поиска шаблона вызовите grep с параметром -r (или --recursive ). Когда используется этот параметр, grep будет искать все файлы в указанном каталоге, пропуская символические ссылки, которые встречаются рекурсивно.

Чтобы следовать по всем символическим ссылкам , вместо -r используйте параметр -R (или --dereference-recursive ).

Вот пример, показывающий, как искать строку linuxize.com во всех файлах внутри каталога /etc :

grep -r linuxize.com /etc

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

/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.linuxize.com;

Если вы используете опцию -R , grep будет следовать по всем символическим ссылкам:

grep -R linuxize.com /etc

Обратите внимание на последнюю строку вывода ниже. Эта строка не печатается, когда grep вызывается с -r потому что файлы внутри каталога с sites-enabled Nginx являются символическими ссылками на файлы конфигурации внутри каталога с sites-available .

/etc/hosts:127.0.0.1 node2.linuxize.com
/etc/nginx/sites-available/linuxize.com:    server_name linuxize.com   www.linuxize.com;
/etc/nginx/sites-enabled/linuxize.com:    server_name linuxize.com   www.linuxize.com;

Показать только имя файла

Чтобы подавить вывод grep по умолчанию и вывести только имена файлов, содержащих совпадающий шаблон, используйте параметр -l (или --files-with-matches ).

Приведенная ниже команда выполняет поиск по всем файлам, заканчивающимся на .conf в текущем рабочем каталоге и выводит только имена файлов, содержащих строку linuxize.com :

grep -l linuxize.com *.conf

Результат будет выглядеть примерно так:

tmux.conf
haproxy.conf

Параметр -l обычно используется в сочетании с рекурсивным параметром -R :

grep -Rl linuxize.com /tmp

Поиск без учета регистра

По умолчанию grep чувствителен к регистру. Это означает, что символы верхнего и нижнего регистра рассматриваются как разные.

Чтобы игнорировать регистр при поиске, вызовите grep с параметром -i (или --ignore-case ).

Например, при поиске Zebra без какой-либо опции следующая команда не покажет никаких результатов, т.е. есть совпадающие строки:

grep Zebra /usr/share/words

Но если вы выполните поиск без учета регистра с использованием параметра -i , он будет соответствовать как заглавным, так и строчным буквам:

grep -i Zebra /usr/share/words

Указание «Зебра» будет соответствовать «зебре», «ZEbrA» или любой другой комбинации букв верхнего и нижнего регистра для этой строки.

zebra
zebra's
zebras

Искать полные слова

При поиске строки grep отобразит все строки, в которых строка встроена в строки большего размера.

Например, если вы ищете «gnu», все строки, в которых «gnu» встроено в слова большего размера, такие как «cygnus» или «magnum», будут найдены:

grep gnu /usr/share/words
cygnus
gnu
interregnum
lgnu9d
lignum
magnum
magnuson
sphagnum
wingnut

Чтобы вернуть только те строки, в которых указанная строка представляет собой целое слово (заключенное в символы, отличные от слов), используйте параметр -w (или --word-regexp ).

Символы слова включают буквенно-цифровые символы ( az , AZ и 0-9 ) и символы подчеркивания ( _ ). Все остальные символы считаются несловесными символами.

Если вы запустите ту же команду, что и выше, включая параметр -w , команда grep вернет только те строки, где gnu включен как отдельное слово.

grep -w gnu /usr/share/words
gnu

Показать номера строк

Параметр -n (или --line-number ) указывает grep показывать номер строки, содержащей строку, соответствующую шаблону. Когда используется эта опция, grep выводит совпадения на стандартный вывод с префиксом номера строки.

Например, чтобы отобразить строки из файла /etc/services содержащие строку bash префиксом совпадающего номера строки, вы можете использовать следующую команду:

grep -n 10000 /etc/services

Результат ниже показывает нам, что совпадения находятся в строках 10423 и 10424.

10423:ndmp            10000/tcp
10424:ndmp            10000/udp

Подсчет совпадений

Чтобы вывести количество совпадающих строк в стандартный вывод, используйте параметр -c (или --count ).

В приведенном ниже примере мы подсчитываем количество учетных записей, в которых в качестве оболочки используется /usr/bin/zsh .

regular expressiongrep -c '/usr/bin/zsh' /etc/passwd
4

Бесшумный режим

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

Вот пример использования grep в тихом режиме в качестве тестовой команды в операторе if :

if grep -q PATTERN filename
then
    echo pattern found
else
    echo pattern not found
fi

Основное регулярное выражение

GNU Grep имеет три набора функций регулярных выражений : базовый, расширенный и Perl-совместимый.

По умолчанию grep интерпретирует шаблон как базовое регулярное выражение, где все символы, кроме метасимволов, на самом деле являются регулярными выражениями, которые соответствуют друг другу.

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

  • Используйте символ ^ (каретка) для сопоставления выражения в начале строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом начале строки.

     grep "^kangaroo" file.txt
  • Используйте символ $ (доллар), чтобы найти выражение в конце строки. В следующем примере строка kangaroo будет соответствовать только в том случае, если она встречается в самом конце строки.

     grep "kangaroo$" file.txt
  • Используйте расширение . (точка) символ, соответствующий любому одиночному символу. Например, чтобы сопоставить все, что начинается с kan затем имеет два символа и заканчивается строкой roo , вы можете использовать следующий шаблон:

     grep "kan..roo" file.txt
  • Используйте [ ] (скобки) для соответствия любому одиночному символу, заключенному в квадратные скобки. Например, найдите строки, содержащие accept или « accent , вы можете использовать следующий шаблон:

     grep "acce[np]t" file.txt
  • Используйте [^ ] для соответствия любому одиночному символу, не заключенному в квадратные скобки. Следующий шаблон будет соответствовать любой комбинации строк, содержащих co(any_letter_except_l)a , например coca , cobalt и т. Д., Но не будет соответствовать строкам, содержащим cola ,

     grep "co[^l]a" file.txt

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

Расширенные регулярные выражения

Чтобы интерпретировать шаблон как расширенное регулярное выражение, используйте параметр -E (или --extended-regexp ). Расширенные регулярные выражения включают в себя все основные метасимволы, а также дополнительные метасимволы для создания более сложных и мощных шаблонов поиска. Вот несколько примеров:

  • Сопоставьте и извлеките все адреса электронной почты из данного файла:

     grep -E -o "b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,6}b" file.txt
  • Сопоставьте и извлеките все действительные IP-адреса из данного файла:

     grep -E -o '(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)' file.txt

Параметр -o используется для печати только соответствующей строки.

Поиск нескольких строк (шаблонов)

Два или более шаблонов поиска можно объединить с помощью оператора ИЛИ | .

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

В приведенном ниже примере мы ищем все вхождения слов fatal , error и critical в файле ошибок журнала Nginx :

grep 'fatal|error|critical' /var/log/nginx/error.log

Если вы используете опцию расширенного регулярного выражения -E , то оператор | не следует экранировать, как показано ниже:

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Строки печати перед матчем

Чтобы напечатать определенное количество строк перед совпадающими строками, используйте параметр -B (или --before-context ).

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

grep -B 5 root /etc/passwd

Печатать строки после матча

Чтобы напечатать определенное количество строк после совпадающих строк, используйте параметр -A (или --after-context ).

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

grep -A 5 root /etc/passwd

Выводы

Команда grep позволяет искать шаблон внутри файлов. Если совпадение найдено, grep печатает строки, содержащие указанный шаблон.

Подробнее о Grep можно узнать на странице руководства пользователя Grep .

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

When you are working on a server that has a big and large set of files, you must have a knowledge of grep command to search files that containing a specific string.

Find command is not capable to look inside a text file for a string.

Grep also know as a “global search for the regular expression” is a command-line utility that can be used to search for lines matching a specific string and display the matching lines to standard output.

In this tutorial, we will show you how to find files that contain specific string in Linux.

The basic syntax of grep command is shown below:

grep -irhnwl "search string" "directory-path"

Where:

  • -i : Used to ignore case sensitive string.
  • -r : Used to search directory recursively.
  • -h : Used to suppress the inclusion of the file names in the output.
  • -n : Used to display line numbers in the output.
  • -w : Used to search for matching whole words only.
  • -l : Used to display filename without matching string.

For more information about grep comamnd, run the following command:

man grep

You should see the grep manual page in the following screen:

To Search a File

To search all the lines that containing specific string in the single file use the following syntax:

grep "string" "path-of-the-file"

For example, search for a string called “nginx” in the file /etc/nginx/nginx.conf, run the following command:

grep nginx /etc/nginx/nginx.conf

You should see the following output:

pid /run/nginx.pid;
include /etc/nginx/mime.types;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
# nginx-naxsi config
# Uncomment it if you installed nginx-naxsi
#include /etc/nginx/naxsi_core.rules;
# nginx-passenger config
# Uncomment it if you installed nginx-passenger
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript

To search for a string called “nginx” in all the files located inside directory /etc/nginx/, run the following command:

grep nginx /etc/nginx/*

You should see the following output:

grep: /etc/nginx/conf.d: Is a directory
/etc/nginx/fastcgi_params:fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
/etc/nginx/koi-utf:# If you need a full and standard map, use contrib/unicode2nginx/koi-utf
/etc/nginx/naxsi-ui.conf.1.4.1:rules_path = /etc/nginx/naxsi_core.rules
/etc/nginx/nginx.conf:pid /run/nginx.pid;
/etc/nginx/nginx.conf: include /etc/nginx/mime.types;
/etc/nginx/nginx.conf: access_log /var/log/nginx/access.log;
/etc/nginx/nginx.conf: error_log /var/log/nginx/error.log;
/etc/nginx/nginx.conf: # nginx-naxsi config
/etc/nginx/nginx.conf: # Uncomment it if you installed nginx-naxsi
/etc/nginx/nginx.conf: #include /etc/nginx/naxsi_core.rules;
/etc/nginx/nginx.conf: # nginx-passenger config
/etc/nginx/nginx.conf: # Uncomment it if you installed nginx-passenger
/etc/nginx/nginx.conf: include /etc/nginx/conf.d/*.conf;
/etc/nginx/nginx.conf: include /etc/nginx/sites-enabled/*;
/etc/nginx/nginx.conf:# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
grep: /etc/nginx/sites-available: Is a directory
grep: /etc/nginx/sites-enabled: Is a directory
/etc/nginx/win-utf:# use contrib/unicode2nginx/win-utf map instead.

Search All Files in a Specific Directory Recursively

To search for a specific string in all files located inside specific directory recursively, use the following syntax:

grep -r "search-string" "/path-of-the-directory"

For example, find all files that containing string called “ubuntu” in the directory /mnt/grub.d recursively, run the following command:

grep -r ubuntu /mnt/grub.d/

You should see the following output:

/mnt/grub.d/10_linux:ubuntu_recovery="1"
/mnt/grub.d/10_linux: Ubuntu|Kubuntu)
/mnt/grub.d/10_linux:if [ "$ubuntu_recovery" = 1 ]; then
/mnt/grub.d/10_linux: if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) &&
/mnt/grub.d/05_debian_theme: Tanglu|Ubuntu|Kubuntu)
/mnt/grub.d/05_debian_theme: Ubuntu|Kubuntu)

In the above output, you should see all the search string with the filename.

If you want to display the only filename, run the grep command with -l option:

grep -rl ubuntu /mnt/grub.d/

You should see only filenames that match with search string:

/mnt/grub.d/10_linux
/mnt/grub.d/05_debian_theme

You can also run the following command to display only filenames:

grep -H -R ubuntu /mnt/grub.d/ | cut -d: -f1

You should see the following output:

/mnt/grub.d/10_linux
/mnt/grub.d/10_linux
/mnt/grub.d/10_linux
/mnt/grub.d/10_linux
/mnt/grub.d/05_debian_theme
/mnt/grub.d/05_debian_theme

If you want to display only search string without filenames, run the grep command as shown below:

grep -rh ubuntu /mnt/grub.d/

You should see the following output:

ubuntu_recovery="1"
Ubuntu|Kubuntu)
if [ "$ubuntu_recovery" = 1 ]; then
if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) &&
Tanglu|Ubuntu|Kubuntu)
Ubuntu|Kubuntu)

To ignore case when searching for a string, use grep command with -i option as shown below:

grep -ir ubuntu /mnt/grub.d/

You should see the following output:

/mnt/grub.d/10_linux:ubuntu_recovery="1"
/mnt/grub.d/10_linux: Ubuntu|Kubuntu)
/mnt/grub.d/10_linux:if [ "$ubuntu_recovery" = 1 ]; then
/mnt/grub.d/10_linux: if ([ "$ubuntu_recovery" = 0 ] || [ x$type != xrecovery ]) &&
/mnt/grub.d/05_debian_theme: Tanglu|Ubuntu|Kubuntu)
/mnt/grub.d/05_debian_theme: # Set a monochromatic theme for Tanglu/Ubuntu.
/mnt/grub.d/05_debian_theme: Ubuntu|Kubuntu)

To Find Whole Words Only

To find all the lines that matches only whole words using the following syntax:

grep -wr "word" "/path-of-the-directory"

For example, find all the lines that matches for word “Ubuntu” in /mnt/grub.d directory.

grep -wr Ubuntu /mnt/grub.d/

You should see the following output:

/mnt/grub.d/10_linux: Ubuntu|Kubuntu)
/mnt/grub.d/05_debian_theme: Tanglu|Ubuntu|Kubuntu)
/mnt/grub.d/05_debian_theme: # Set a monochromatic theme for Tanglu/Ubuntu.
/mnt/grub.d/05_debian_theme: Ubuntu|Kubuntu)

If you want to search for two words “Ubuntu” and “Linux” in /mnt/grub.d directory, run the following command:

egrep -wr 'Ubuntu|Linux' /mnt/grub.d/

You should see the following output:

/mnt/grub.d/20_linux_xen: OS=GNU/Linux
/mnt/grub.d/20_linux_xen: OS="${GRUB_DISTRIBUTOR} GNU/Linux"
/mnt/grub.d/20_linux_xen:# the initrds that Linux uses don't like that.
/mnt/grub.d/20_linux_xen: title="$(gettext_printf "%s, with Xen %s and Linux %s (%s)" "${os}" "${xen_version}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")"
/mnt/grub.d/20_linux_xen: title="$(gettext_printf "%s, with Xen %s and Linux %s" "${os}" "${xen_version}" "${version}")"
/mnt/grub.d/20_linux_xen: lmessage="$(gettext_printf "Loading Linux %s ..." ${version})"
/mnt/grub.d/10_linux: OS=GNU/Linux
/mnt/grub.d/10_linux: Ubuntu|Kubuntu)
/mnt/grub.d/10_linux: OS="${GRUB_DISTRIBUTOR} GNU/Linux"
/mnt/grub.d/10_linux:# the initrds that Linux uses don't like that.
/mnt/grub.d/10_linux: title="$(gettext_printf "%s, with Linux %s (%s)" "${os}" "${version}" "$(gettext "${GRUB_RECOVERY_TITLE}")")" ;;
/mnt/grub.d/10_linux: title="$(gettext_printf "%s, with Linux %s" "${os}" "${version}")" ;;
/mnt/grub.d/10_linux: if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
/mnt/grub.d/10_linux: message="$(gettext_printf "Loading Linux %s ..." ${version})"
/mnt/grub.d/30_os-prober: if [ x"$title" = x"$GRUB_ACTUAL_DEFAULT" ] || [ x"Previous Linux versions>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
/mnt/grub.d/05_debian_theme: Tanglu|Ubuntu|Kubuntu)
/mnt/grub.d/05_debian_theme: # Set a monochromatic theme for Tanglu/Ubuntu.
/mnt/grub.d/05_debian_theme: Ubuntu|Kubuntu)

To display line numbers with matching words “Ubuntu”, use the grep command with -n option as shown below:

grep -wrn Ubuntu /mnt/grub.d/

You should see the following output:

/mnt/grub.d/10_linux:40: Ubuntu|Kubuntu)
/mnt/grub.d/05_debian_theme:32: Tanglu|Ubuntu|Kubuntu)
/mnt/grub.d/05_debian_theme:33: # Set a monochromatic theme for Tanglu/Ubuntu.
/mnt/grub.d/05_debian_theme:177: Ubuntu|Kubuntu)

Find all Lines that Starting with Lowercase or Uppercase Letter

To search for lines that start with an uppercase letter, use the following syntax:

grep "^[A-Z]" -rns "/path-of-the-directory"

To search for lines that start with a lowercase letter, use the following syntax:

grep "^[a-z]" -rns "/path-of-the-directory"

To search for lines that start with lowercase and uppercase letter, use the following syntax:

grep "^[a-zA-Z]" -rns "/path-of-the-directory"

Conclusion

Thats it for now. We hope you have now enough knowledge on how to use grep command to find a file containing a specific text. Feel free to ask any questions if you have any below in the comments.

Понравилась статья? Поделить с друзьями:
  • Microsoft visual c runtime library buffer overrun detected как исправить
  • Как найти подходящий сериал
  • Как составить смету на ресурсы
  • Как найти углы треугольника по теореме синусов
  • Как составить расписание уроков в школе программа скачать бесплатно без регистрации