Команда Grep в Linux

Команда Grep в Linux

Grep (аббревиатура от «Global Regular Expression Print») — одна из наиболее часто используемых команд в 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 ).

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

 grep -r linuxgazette.ru /etc

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

 /etc/hosts:127.0.0.1 node2.linuxgazette.ru /etc/nginx/sites-available/linuxgazette.ru: server_name linuxgazette.ru www.linuxgazette.ru;

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

 grep -R linuxgazette.ru /etc

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

 /etc/hosts:127.0.0.1 node2.linuxgazette.ru /etc/nginx/sites-available/linuxgazette.ru: server_name linuxgazette.ru www.linuxgazette.ru; /etc/nginx/sites-enabled/linuxgazette.ru: server_name linuxgazette.ru www.linuxgazette.ru;

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

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

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

 grep -l linuxgazette.ru *.conf

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

 tmux.conf haproxy.conf

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

 grep -Rl linuxgazette.ru /tmp

По умолчанию grep учитывает регистр, то есть заглавные и строчные символы воспринимаются как отдельные. Например, поиск по запросу «linux» не даст результатов по запросу «Linux».

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

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

 grep Zebra /usr/share/words

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

 grep -i Zebra /usr/share/words

В приведенной выше команде «Zebra» будет соответствовать «zebra», «ZEbrA» или любой другой комбинации заглавных и строчных букв в этой строке.

 zebra zebra's zebras

Поиск полных слов

При поиске строки grep отобразит все строки, где строка встроена в более крупные строки.

Например, если вы ищете строку «gnu», grep найдет все строки, содержащие «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 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» .

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

grep- терминал

Связанные руководства

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *