Утилита grep
Опции поиска
| Опция | Описание |
|---|---|
| -o | показывать только найденное совпадение по регулярке |
| -v | не показывать найденные строки |
| -c | подсчитать количество строк |
| -i | не учитывать регистр |
| -P | Perl выражения \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 выполняет поиск строк, содержащих совпадение с заданным ШАБЛОНОМ (PATTERN), в указанных входных ФАЙЛАХ (FILE).
- Если файлы не указаны или указан символ дефиса (-), grep читает данные из стандартного ввода (stdin).
- По умолчанию grep выводит все строки, которые содержат совпадение.
Найти все строки, содержащие ключевое слово
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