Содержание

Утилита grep

Опции поиска

ОпцияОписание
-oпоказывать только найденное совпадение по регулярке
-vне показывать найденные строки
-cподсчитать количество строк
-iне учитывать регистр
-PPerl выражения \d
-rПрочитать все файлы в каждой папке, рекурсия
-lФайл, содержащий строки для поиска
^Поиск с начала строки
.$Поиск до конца файла
^$Поиск пустых строк

Префиксы вывода

ПараметрОписание
-b Выведите байтовое смещение совпадения во входном файле
-H Печатать имя файла, содержащего совпадение
-h Не печатать имя файла, содержащего совпадение
-n Печатать номер строки каждого совпадения
-T Печатать начальный символ Tab перед совпадениями, чтобы вывод был аккуратно выровнен

Вывод

ПараметрОписание
-cВыведите только количество строк, содержащих совпадение
–colo[u]rПодсвечивать совпадения
-lВыведите имена файлов с совпадениями
-LВыведите имена искомых файлов, которые не содержат совпадений
-oПечатать только совпадающую часть строки
-sПодавление ошибок (например, несуществующих или нечитаемых файлов)
-A nВыведите n количество строк после совпадающей строки
-B nВыведите n количество строк перед совпадающей строкой
-C nВыведите n количество строк до и после совпадающей строки

Несколько строк

По умолчанию, чтобы OR воспринимался, как регулярка, его надо экранировать

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

или включить режим расширенных регулярных выражений –extended-regexp

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

Но так будут искаться вхождения слов. Чтобы искать только целые слова, нужно

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

Регистронезависимый поиск

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

Просмотр конфиг файла без комментариев

grep ^[^#] /etc/postfix/main.cf
 
# без пробелов
egrep -v "^$|^[[:space:]]*;" /etc/php/7.1/cli/php.ini 
 
# или так
egrep -v "^$|^[[:space:]]*#" /etc/postfix/main.cf
Выражение Описание
^$Совпадение для удаления пустых строк
^[[:space:]]*# или ^[[:space:]]*Совпадение строк начинающихся на # или ; или содержит пробелы или табуляцию
| оператор или в регулярных выражениях

Скрипт nocomment, который можно использовать самостоятельно с параметром или через pipe.

#!/bin/sh
egrep -a -v '^[[:space:]]*#' $1 | egrep -a '[[:print:]]'

Поиск российских емейлов

  grep  -roih  "[A-z0-9._-]*@[A-z0-9._-]*\.ru" /usr/share/doc |  sort -u  | wc

Или

  egrep "^(aaa|bbb|ccc)" - начинается на aaa, bbb или ccc

Общий синтаксис

  grep [pattern] FILE
НастройкаОписание
grep '^[A,E].*o' f.txt Найти строки, начинающиеся на A или E и заканчивающиеся на o
grep -f pat.txt f.txtСканировать файл f.txt, используя содержимое pat.txt
grep -i Gnu f.txtПоиск Gnu в файле f.txt без учёта регистра
grep -v gnu f.txtПоиск строк не содержащих gnu
grep -w 'a.*o' f.txtПоиск совпадений слов, игнорируя подстроки
grep -x 'a.*o' f.txtНайти целые строку, удовлетворяющие только, как ^(a.*o)

Таблица параметров

Выделение папок и файлов

ПараметрОписание
-aОбработайте двоичный файл так, как если бы он был текстовым
-D <skip|read>Пропуск или чтение FIFO, устройства или сокета
-d <skip|read|recurse>Пропуск, чтение или перемещение по каталогу
--exclude '*.sh'Не ищите файлы с суффиксом .sh
--exclude-from FILEПропустите любой файл, указанный в списке FILE
--exclude-dir *fooПропустите любую директорию, заканчивающуюся на foo
-rКогда встречается каталог, поиск файлов в нем
-RПоиск по каталогам и следование симлинкам

Варианты (Variants)

Параметр Описание
-G Использовать базовые регулярные выражения (по умолчанию)
-E Расширенные регулярные выражения (ERE)
-F Интерпретировать шаблон как обычную строку, а не регулярное выражение
-P Использовать регулярные выражения в стиле Perl (PCRE)

Регулярные выражения (Regular expression)

Символ Описание
. Любой одиночный символ
? Совпадение с предыдущим элементом 0 или 1 раз
* Совпадение с предыдущим элементом 0 или более раз
+ Совпадение с предыдущим элементом 1 или более раз
{2} Совпадение с предыдущим элементом ровно 2 раза
{3,} Совпадение с предыдущим элементом 3 или более раз
{,4} Совпадение с предыдущим элементом не более 4 раз
{1,5} Совпадение с предыдущим элементом от 1 до 5 раз включительно
[A,B] Совпадение с символом A или B
[3-9] Совпадение с любой цифрой в диапазоне от 3 до 9
^ Начало строки
$ Конец строки
\s Пробельный символ (пробел, табуляция и т.д.)

Классы символов POSIX

Класс Описание
[:alnum:] Буквенно-цифровые символы
[:alpha:] Буквенные символы
[:digit:] Цифры от 0 до 9
[:punct:] Знаки пунктуации
[:space:] Пробельные символы

Примеры


Найти все строки, содержащие ключевое слово

grep sysadmin /etc/passwd

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

grep -n sysadmin /etc/passwd

Показать строки, НЕ содержащие указанное слово:

grep -nv nologin /etc/passwd

Исключить строки с указанным словом

grep -v sysadmin /etc/passwd

Подсчитать количество совпадений

grep -c sysadmin /etc/passwd

Игнорировать регистр символов

grep -i sysadmin /etc/passwd

Найдёт:

- sysadmin - SysAdmin - SYSADMIN


Поиск во всех файлах каталога и подкаталогов

Показать совпадающие строки:

grep -ri sysadmin /home/

Показать только имена файлов, содержащих совпадение:

grep -ril sysadmin /home/

Поиск точного IP-адреса

Опция -F выполняет поиск точной строки (без regex-интерпретации точки):

grep -F "192.168.1.10" /var/log/syslog

Без -F точка "." означает "любой символ".


Найти строки, начинающиеся с определённого текста

Найти строки, начинающиеся с Feb:

grep ^Feb /var/log/syslog

Найти строки, заканчивающиеся определённым текстом

Найти строки, заканчивающиеся на queue:

grep queue$ /var/log/mail.log

Подсчитать количество пустых строк

Пустыми считаются строки без символов (строки с пробелами не учитываются):

grep -c ^$ /var/log/mail.log

Поиск строки во всех файлах текущего каталога

grep -r "root" .

Использование Perl-совместимых регулярных выражений (PCRE)

grep -oP '\bs.*a\b' file