Android

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

How to use the uniq command: 2-Minute Linux Tips

How to use the uniq command: 2-Minute Linux Tips

Оглавление:

Anonim

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

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

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

Синтаксис команды Grep

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

Выражения утилиты grep имеют следующую форму:

grep PATTERN

Элементы в квадратных скобках не являются обязательными.

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

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

Как использовать grep для поиска строки в файлах

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

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

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 ).

Например, для отображения строк из файла /etc/passwd которые не содержат строку 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 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

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

Для рекурсивного поиска шаблона используйте параметр -r (или --recursive ). Это позволит выполнить поиск по всем файлам в указанном каталоге, пропуская символические ссылки, которые встречаются рекурсивно. Чтобы --dereference-recursive по всем символическим ссылкам, используйте опцию -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 вы используете опцию -R grep будет следовать по всем символическим ссылкам:

grep -R linuxize.com /etc

Обратите внимание на последнюю строку вывода. Эта строка не печатается в приведенном выше примере, потому что файлы в каталоге с 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 по умолчанию и печатать только имена файлов, содержащих сопоставленный шаблон, вы можете использовать --files-with-matches -l (или --files-with-matches ).

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

grep -l linuxize.com *.conf

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

tmux.conf haproxy.conf

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

grep -Rl linuxize.com /tmp

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

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

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

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

grep Zebra /usr/share/words

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

grep -i Zebra /usr/share/words

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

zebra zebra's zebras

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

При поиске «gnu» grep также напечатает строки, в которых «gnu» встроен в более крупные слова, такие как «cygnus» или «magnum».

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

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

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

grep -w gnu /usr/share/words

gnu

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

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

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

grep -n 10000 /etc/services

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

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

Граф Матчи

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

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

grep -c '/usr/bin/zsh' /etc/passwd

4

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

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

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

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

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

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

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

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

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

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

GNU Grep имеет два набора функций регулярных выражений, Basic и Extended. По умолчанию grep интерпретирует шаблон как основное регулярное выражение.

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

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

    grep "^kangaroo" file.txt

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

    grep "kangaroo$" file.txt

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

    grep "kan..roo" file.txt

    использование (скобки) для соответствия любому отдельному символу, заключенному в скобки. Например, найдите строки, которые содержат accept или « accent , вы можете использовать следующий шаблон:

    grep "accet" file.txt

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

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

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

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

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

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

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

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

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

Линии печати перед матчем

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

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

grep -B 5 root /etc/passwd

Линии печати после матча

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

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

grep -A 5 root /etc/passwd

Вывод

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

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

grep терминал