16 примеров команд grep, которые помогут вам в реальном мире
Опубликовано: 2021-02-23grep, первоначально разработанный для систем на основе Unix, является одной из наиболее широко используемых утилит командной строки в Linux.
Его название происходит от другой похожей команды в инструменте ed, т. е. g / re / p , что означает глобальный поиск регулярного выражения и печать совпадающих строк. grep в основном ищет заданный шаблон или регулярное выражение из стандартного ввода или файла и печатает строки, соответствующие заданным критериям. Он часто используется для фильтрации ненужных сведений при печати только необходимой информации из больших файлов журналов.
Сила регулярных выражений в сочетании с поддерживаемыми параметрами в grep делает это возможным.
Здесь мы рассмотрим некоторые часто используемые команды grep в различных сценариях системным администратором или разработчиком.
Итак, приступим…
Синтаксис команды grep
Команда grep ожидает шаблон и необязательные аргументы вместе со списком файлов, если используется без конвейера.
$ grep [options] pattern [files]
Простой пример:
$ grep my file.txt my_file $
Поиск нескольких файлов
grep позволяет искать заданный шаблон не только в одном, но и в нескольких файлах. Вот как вы можете искать шаблон в нескольких файлах, используя подстановочный знак *
.
$ sudo grep -i err /var/log/messages*
Выход:
$ sudo grep err /var/log/messages* /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages:Dec 28 10:36:52 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: Using IOAPIC for interrupt routing /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201225:Dec 23 23:01:00 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKA] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKB] (IRQs 5 9 *10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKC] (IRQs 5 *9 10 11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: ACPI: PCI Interrupt Link [LNKD] (IRQs 5 9 10 *11) /var/log/messages-20201227:Dec 27 19:11:18 centos7vm kernel: BERT: Boot Error Record Table support is disabled. Enable it by using bert_enable as kernel parameter. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. /var/log/messages-20201227:Dec 27 19:11:21 centos7vm kernel: [drm:vmw_host_log [vmwgfx]] *ERROR* Failed to send host log message. $
Из приведенного выше вывода видно, что сначала печатается имя файла, а затем соответствующая строка, чтобы указать, где grep
нашел данный шаблон.
Поиск без учета регистра
grep предлагает искать шаблон, не глядя на его регистр. Используйте флаг -i
, чтобы указать grep игнорировать регистр.
$ grep -i [pattern] [file]
Выход:
$ grep -i it text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $
Поиск всего слова
Не всегда нам нужно частичное совпадение, вместо этого мы ожидаем, что grep будет соответствовать только полному слову. Вы можете сделать это с флагом -w
.
$ grep -w [pattern] [file]
Выход:
$ grep -w is text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $
Проверить количество совпадений
Иногда вместо фактической совпадающей строки нам нужно просто количество успешных совпадений, сделанных grep. Мы можем получить это количество, используя опцию -c
.
$ grep -c [pattern] [file]
Выход:
$ grep -c is text_file.txt 2 $
Поиск в подкаталогах
Часто бывает необходимо искать файлы не только в текущем рабочем каталоге, но и в подкаталогах. grep позволяет вам легко сделать это с флагом -r
.
$ grep -r [pattern] *
Выход:
$ grep -r Hello * dir1/file1.txt:Hello One dir1/file2.txt:Hello Two dir1/file3.txt:Hello Three $
Как вы можете видеть, grep проходит через каждый подкаталог внутри текущего каталога и перечисляет файлы и строки, в которых найдено совпадение.
Обратный поиск
Если вы хотите найти что-то, что не соответствует заданному шаблону, grep позволяет сделать это с помощью флага -v
.
$ grep -v [pattern] [file]
Выход:
$ grep This text_file.txt This is a sample text file. It contains This is a sample text file. It's repeated two times. $ grep -v This text_file.txt several lines to be used as part of testing grep functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $
Вы можете сравнить вывод команды grep
для одного и того же шаблона и файла с флагом -v
и без него. С -v
печатаются любые строки, не соответствующие шаблону.
Распечатать номера строк
grep позволяет вам печатать номера строк вместе с напечатанными строками, что позволяет легко узнать, где находится строка в файле. Используйте опцию -n
, как показано, чтобы получить номера строк в выводе.
$ grep -n [pattern] [file]
Выход:
$ grep -n This text_file.txt 1:This is a sample text file. It contains 7:This is a sample text file. It's repeated two times. $
Ограничить вывод grep
Для больших файлов, таких как журналы и т. Д., Вывод grep может быть длинным, и вам может просто понадобиться фиксированное количество строк в выводе вместо того, чтобы сопоставлять все. Мы можем использовать m[num]
для ограничения печатаемых строк числом. Вот как это использовать:
$ grep -m[num] [pattern] [file]
Обратите внимание, как использование флага -m
влияет на вывод grep для того же набора условий в примере ниже:
$ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep -m2 It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as $
Показать дополнительные строки
Часто нам нужны не только строки, которые имеют совпадающий шаблон, но и несколько строк выше или ниже его для лучшего контекста.
Можно напечатать строку выше или ниже (или и то, и другое) строки, имеющей шаблон, используя grep, используя флаги -A
, -B
или -C
с num
значением. Здесь num
обозначает количество дополнительных строк, которые должны быть напечатаны чуть выше или ниже совпадающей строки. Это применимо ко всем совпадениям, которые grep находит в указанном файле или списке файлов.

$ grep -A[num] [pattern] [file]
ИЛИ ЖЕ
$ grep -B[num] [pattern] [file]
ИЛИ ЖЕ
$ grep -C[num] [pattern] [file]
Вывод ниже показывает нормальный вывод grep, а также вывод с флагами -A
, -B
и -C
один за другим. Обратите внимание, как grep интерпретирует флаги и их значения, а также изменения в соответствующем выводе. С флагом -A1
grep печатает 1 строку, которая следует сразу после совпадающей строки.
Точно так же с флагом -B1
он печатает 1 строку непосредственно перед соответствующей строкой. С флагом -C1
печатается 1 строка до и после совпадающей строки.
$ grep numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as $ grep -A1 numbers text_file.txt It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $ grep -B1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as $ grep -C1 numbers text_file.txt kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. $
Список имен файлов
Чтобы напечатать только имена файлов, в которых найден шаблон, вместо фактически совпадающих строк, используйте флаг -l
.
$ grep -l [pattern] [file]
Вот пример запуска:
$ grep -l su *.txt file.txt text_file.txt $
Печатать точные строки
Иногда нам нужно напечатать строки, которые точно соответствуют заданному шаблону, а не какой-то его части. grep позволяет флагу -x
делать именно это.
$ grep -x [pattern] [file]
В приведенном ниже примере файл file.txt содержит строку только с одним словом «поддержка» и поэтому сопоставляется grep с флагом -x
, игнорируя строки, которые могут содержать слова «поддержка» вместе с другим текстом.
$ grep -x support *.txt file.txt:support $
Совпадение с начальной строкой
Используя регулярные выражения, мы можем найти строку в начале строки. Вот как это сделать.
$ grep [options] "^[string]" [file]
Пример:
$ grep It text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $ grep ^It text_file.txt It supports numbers like 1, 2, 3 etc. as well as $
Обратите внимание, как использование символа ^
изменяет вывод. ^
указывает на начало строки, а grep сопоставляет ^It
как любую строку, начинающуюся со слова It
. Заключение в кавычки может помочь, когда шаблон содержит пробелы и т. д.
Конечная строка совпадения
Еще одно распространенное полезное регулярное выражение — соответствие концу шаблона строки.
$ grep [options] "[string]$" [file]
Пример:
$ grep "\." text_file.txt This is a sample text file. It contains functionality. You can always use grep with any kind of data but it works best with text data. It supports numbers like 1, 2, 3 etc. as well as alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $ grep "\.$" text_file.txt kind of data but it works best with text data. alphabets and special characters like - + * # etc. This is a sample text file. It's repeated two times. $
Мы попытались сопоставить .
символ в конце строки. Поскольку точка (.) является символом специального значения, нам нужно экранировать его с помощью символа \
. Снова обратите внимание, как меняется вывод, когда мы просто сопоставляем .
символ, и когда мы используем $
, чтобы указать grep на соответствие только тем строкам, которые заканчиваются на .
(не те, которые могут содержать его где-то посередине).
Использовать файл шаблона
Могут быть ситуации, когда у вас есть сложный список шаблонов, которые вы часто используете. Вместо того, чтобы каждый раз записывать его, вы можете указать список шаблонов в файле и использовать с флагом -f
. Файл должен содержать по одному шаблону на строку.
$ grep -f [pattern_file] [file_to_match]
В нашем примере мы создали имена файлов шаблонов pattern.txt
со следующим содержимым:
$ cat pattern.txt This It $
Чтобы использовать его, используйте флаг -f
.
$ grep -f pattern.txt text_file.txt This is a sample text file. It contains It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $
Укажите несколько шаблонов
grep позволяет указать несколько шаблонов с помощью флага -e
.
$ grep -e [pattern1] -e [pattern2] -e [pattern3]...[file]
Пример:
$ grep -e is -e It -e to text_file.txt This is a sample text file. It contains several lines to be used as part of testing grep It supports numbers like 1, 2, 3 etc. as well as This is a sample text file. It's repeated two times. $
Укажите расширенное регулярное выражение
grep также поддерживает расширенные регулярные выражения или ERE с использованием флага -E
. Это похоже на команду egrep
в Linux.
Использование ERE имеет преимущество, когда вы хотите обрабатывать метасимволы как есть и не хотите заменять их строками, такими как grep. Это дает вам больше гибкости с точки зрения экранирования, как это требуется в случае с grep. При этом использование -E
с grep эквивалентно команде egrep
.
$ grep -E '[Extended RegEx]' [file]
Вот одно из применений ERE, когда мы хотим напечатать строки без комментариев или пустые. Это особенно полезно для поиска чего-либо в больших файлах конфигурации. Я дополнительно использовал флаг -v
, чтобы НЕ печатать строки, соответствующие шаблону '^(#|$)'
.
$ sudo grep -vE '^(#|$)' /etc/ssh/sshd_config HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ecdsa_key HostKey /etc/ssh/ssh_host_ed25519_key SyslogFacility AUTHPRIV AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes ChallengeResponseAuthentication no GSSAPIAuthentication yes GSSAPICleanupCredentials no UsePAM yes X11Forwarding yes AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE AcceptEnv XMODIFIERS Subsystem sftp /usr/libexec/openssh/sftp-server $
Вывод
Вышеприведенные примеры — лишь верхушка айсберга. grep поддерживает ряд опций и может быть очень полезным инструментом в руках человека, который знает, как его эффективно использовать. Мы можем не только использовать приведенные выше примеры, но и комбинировать их по-разному, чтобы получить то, что нам нужно.
Обратитесь к его справочной странице, чтобы узнать больше об этом.
$ man grep
Затем изучите примеры команд SFTP.