Содержание

Утилита 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 Use basic regex (this is the default)
-E Extended regex
-F Interpret the search pattern as a fixed string, not regex
-P Use Perl regex (PCRE)

Regular expression

ПараметрОписание
. Any single character
? Match preceding item zero or one time
* Match preceding item zero or more times
+ Match preceding item one or more times
{2} Match preceding item two times
{3,} Match preceding item three or more times
{,4} Match preceding item at most four times
{1,5} Match preceding item at least once, but no more than five times
[A,B] Match A or B [:alnum:] Alphanumeric character
[3-9] Match all digits 3 to 9 [:alpha:] Alphabetic character
Start of a line [:digit:] Digits 0 through 9
$ End of a line [:punct:] Punctuation
\s Space [:space:] Space

Примеры

grep searches the named input FILEs (or standard input if no files are named, or if a single hyphen-minus (-) is given as file name) for lines containing a match to the given PATTERN. By default, grep prints the matching lines

Найти Find all lines matching a specific keyword on a file.

grep sysadmin /etc/passwd

Display with numbers

grep -nv nologin /etc/passwd To avoid the keyword and search for other

grep -v sysadmin /etc/passwd To count how many lines match for the keywords we are searching

grep -c sysadmin /etc/passwd To search text by ignoring the case

grep -i sysadmin /etc/passwd Search all files in /home and its subdirectories for text matching a specific pattern and print the matching lines

grep -ri sysadmin /home/ Search all files in /home and its subdirectories for text matching a specific pattern and list the files which contain it

grep -ril sysadmin /home/ To search for a particular IP mentioned among many IPs. The -F ensures that the . match literal . characters, without it they would match any character.

grep -F "192.168.1.10" /var/log/syslog To search for a line that starts with Feb

grep ^Feb /var/log/syslog To search for a line that ends with queue

grep queue$ /var/log/mail.log To count the empty lines in a file (lines containing whitespace will not be counted)

grep -c ^$ /var/log/mail.log Search for a string inside all files of a directory and its subdirectories

grep -r "root" .

Try this GNU grep command with -P(Perl-regex) option,

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

Explanation:

\b # Matches the word boundary(ie, match between a word character and a non word character) s # Starting character would be a literal s. .* # Matches any character zero or more times. a # Matches a literal a. \b # Matches the word boundary(ie, match between a word character and a non word character) Share Improve this answer Follow