Правильное использование команд Find и Grep в Linux

Большинство начинающих пользователей Unix-систем, в частности Linux, не знакомы с основными операторами командной строки, которые используются в этой ОС. Давайте более детально разберём функции и применение операторов find и grep.

Как правильно использовать команды Find и Grep в Linux

Использование команд Find и Grep в Linux.

FIND

Команда find в Linux – это утилита командной строки для обхода файловой иерархии. Она может применяться для поиска файлов и каталогов и выполнения последующих операций с ними. Она поддерживает поиск по файлу, папке, имени, дате создания, дате изменения, владельцу и разрешениям. Используя -exec, другие команды UNIX могут быть выполнены для найденных файлов или папок. Синтаксис:

$ find [с чего начать поиск] [выражение определяет, что найти] [-опции] [что найти]

Опции:

  • -exec – искомый файл, который соответствует вышеуказанным критериям и возвращает 0 в качестве состояния выхода для успешного выполнения команды;
  • -ok – работает так же, как -exec, за исключением того, что пользователю сначала предлагается запрос;
  • -inum N – поиск с номером «N»;
  • -links N – поиск со ссылками «N»;
  • -name demo – поиск файлов, указанных в «demo»;
  • -newer file – поиск файлов, которые были изменены/созданы после «file»;
  • -perm octal – поиск, если разрешение «восьмеричное»;
  • -print – показать путь к документам, найденным с использованием остальных критериев;
  • -empty – поиск пустых документов и каталогов;
  • -size + N/-N – поиск блоков «N»; «N» и «c» могут использоваться для измерения размера в символах; «+N» означает больший размер «N» блоков, а «-N» означает меньший размер «N» блоков;
  • -user name – поиск документов, принадлежащих имени пользователя или идентификатору «name»;
  • \(expr\) – True, если «expr» – true; используется для группировки критериев в сочетании с OR или AND.

Команда find в Linux

GREP

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

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

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

[OPTIONS] PATTERN [FILE…]

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

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

Команда grep в Linux

Как вводить команду для поиска в файлах

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

$ grep bash /etc/passwd

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

root 0:0:root:/root:/bin/bash

domain1000:1000:domain:/home/domain:/bin/bash

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

$ «Gnome Display Manager» /etc/passwd

Как вводить команду для поиска в файлах

Invert Match (исключая)

Чтобы отобразить линии, которые не соответствуют шаблону, вводите параметр –v (или —invert-match). Например, чтобы отобразить из /etc/passwd файла, которые не содержат nologin, вы можете ввести следующую команду:

$ -v nologin /etc/passwd

Output:

root 0:0:root:/root:/bin/bash

colord 124:124::/var/lib/colord:/bin/false

git 994:994:git daemon user:/:/usr/bin/git-shell

linuxize 1000:1000:linuxize:/home/linuxize:/bin/bash

Invert Match (исключая)

Как применять команду для поиска в выводе

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

$ ps -ef | www-data

Output:

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 —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

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

$ ps -ef | www-data | grep -v grep

Output:

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 —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). Это позволит выполнить поиск по всем файлам в указанном каталоге, пропуская символические ссылки, которые встречаются рекурсивно. Чтобы перейти по всем символическим ссылкам, используйте опцию –r (или —dereference-recursive). В следующем примере мы ищем domain.com во всех файлах внутри каталога /etc:

$ -r domain.com /etc

Команда напечатает соответствующие поля с префиксом полного пути к файлу.

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

Если вместо –r вы применяете опцию –R, команда будет следовать всем символическим ссылкам:

$ -R domain.com /etc

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

Output:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: server_name domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com: server_name domain.com www.domain.com;

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

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

Чтобы подавить вывод по умолчанию и печатать только имена файлов, содержащих сопоставленный шаблон, вы можете вводить опцию –l (или —files-with-matches). Например, для поиска по всем файлам, заканчивающимся .conf в текущем рабочем каталоге, и печати только имён файлов, содержащих тип domain.com, введите:

$ –l domain.com *.conf

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

tmux.conf

haproxy.conf

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

$ -Rl domain.com /tmp

Нечувствительность к регистру

По умолчанию команда чувствительна к регистру, что означает, что прописные и строчные символы рассматриваются как разные. Чтобы игнорировать регистр при поиске, вводите опцию –i (или —ignore-case). Например, при поиске Zebra без какой-либо опции следующая команда не будет отображать никаких выходных данных, т.е. есть совпадающие.

$ Zebra /usr/share/words

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

$ grep -i Zebra /usr/share/words

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

Output:

zebra

zebra’s

zebras

Точное совпадение

При поиске gnu также будет печатать gnu, в которые вставлены более крупные слова, такие как cygnus или magnum.

$ gnu /usr/share/words

Output:

cygnus

gnu

interregnum

lgnu9d

lignum

magnum

magnuson

sphagnum

wingnut

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

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

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

$ grep -w gnu /usr/share/words

Output: gnu

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

Чтобы показать количество строк, содержащих шаблон, используйте параметр –n (или —line-number). При использовании этой опции будет печатать совпадения на стандартный вывод с префиксом номера, в которой он был найден. Например, для отображения из файла /etc/services, содержащего префикс bash с соответствующим номером, вы можете использовать следующую команду:

$ grep -n 10000 /etc/services

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

Output:

10423:ndmp 10000/tcp

10424:ndmp 10000/udp

Подсчёт

Чтобы напечатать количество совпадающих строк в стандартный вывод, используйте параметр –c (или —count). В приведённом ниже примере мы подсчитываем количество учётных записей, которые имеют оболочку /usr/bin/zsh.

$ grep -c ‘/usr/bin/zsh’ /etc/passwd

Output: 4

Подсчет количества учетных записей

Несколько строк (паттернов)

Оператор ИЛИ может объединить два или более шаблонов поиска |. По умолчанию команда интерпретирует шаблон как основное регулярное выражение, в котором метасимволы теряют своё особое значение, и их версии с обратной косой чертой должны использоваться. В приведённом ниже примере мы ищем все вхождения слов fatal, error и critical в файле журнала регистрации ошибок Nginx:

$ grep ‘fatal\|error\|critical’ /var/log/nginx/error.log

Если вы используете опцию расширенного регулярного выражения –E (или —extended-regexp), оператор не должен быть экранирован, как показано ниже:

$ grep -E ‘fatal|error|critical’ /var/log/nginx/error.log

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

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

  • Используйте символ ^ (символ каретки), чтобы соответствовать выражению в начале строки. В следующем примере ^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

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

Применение мета-символов

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

Чтобы интерпретировать шаблон как расширенное регулярное выражение, используйте параметр –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 используется для печати только соответствия.

Печать перед подсчётом

Чтобы напечатать определённое количество строк перед соответствием, используйте параметр –B (или —before-context). Например, чтобы отобразить 5 строк начального контекста перед сопоставлением, вы можете использовать следующую команду: $ grep -A 5 root /etc/passwd

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

Чтобы напечатать определённое количество строк после сопоставления, используйте параметр –A (или —after-context). Например, чтобы отобразить 5 линий конечного контекста после сопоставления строк, вы можете использовать следующую команду: $ grep -B 5 root /etc/passwd

Это вся необходимая для полноценного применения команд информация. Если вы уже используете Linux и можете дать какие-либо советы начинающим, поделитесь комментариями под этой статьёй.

  • ВКонтакте
  • facebook
  • обычная форма
  • Оставить комментарий

сети
программы
Smart TV
ос
не нашли ответ?

Ваше имя (обязательно)

Ваш e-mail (обязательно)

Тема

Сообщение