Команда Grep в Linux (Поиск текста в файлах)

Grep Command in Linux (Find Text in Files)

21 Июня 2020 | Терминал

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

Команда Grep в Linux (Поиск текста в файлах)

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

grep ищет в одном или нескольких входных файлах строки, соответствующие заданному шаблону, и записывает каждую соответствующую строку в стандартный вывод. Если файлы не указаны, 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
baksdev:x:1000:1000:baksdev:/home/baksdev:/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
baksdev:x:1000:1000:baksdev:/home/baksdev:/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 ).

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

grep -r baks.dev /etc 


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

/etc/hosts:127.0.0.1 node2.baks.dev
/etc/nginx/sites-available/baks.dev:    server_name baks.dev   www.baks.dev;
 

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

grep -R baks.dev /etc 

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

/etc/hosts:127.0.0.1 node2.baks.dev
/etc/nginx/sites-available/baks.dev:    server_name baks.dev   www.baks.dev;
/etc/nginx/sites-enabled/baks.dev:    server_name baks.dev   www.baks.dev;
 

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

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

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

grep -l baks.dev *.conf 


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

tmux.conf
haproxy.conf
 

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

grep -Rl baks.dev /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 ).

Символов слова включают в себя буквенно - цифровые символы ( a-z , A-Z и 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 expression grep -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 .

Комментарии
Если у вас есть вопросы, не стесняйтесь оставлять комментарии ниже.
Загрузка комментариев...