Семейство команд grep

Оглавление

Команда grep


Употребление кавычек

Параметры команды grep

Поиск среди нескольких файлов

Вывод номеров строк

Поиск строк, не соответствующих шаблону

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

Определение числа строк, в которых найдено совпадение

Поиск символов на границе слов

Команда grep и регулярные выражения

Выбор символов из списка

Шаблон, соответствующий любому символу

Инверсия шаблона с помощью метасимвола ´^´

Поиск по дате

Комбинированные диапазоны

Поиск повторяющихся последовательностей

Выбор из нескольких шаблонов

Поиск пустых строк

Поиск специальных символов

Поиск имен файлов, соответствующих заданному формату

Поиск IP-адресов

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

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

Другие примеры использования команды grep

Фильтрация списка файлов

Подавлание вывода сообщений об ошибках

Фильтрация списка процессов

grep для поиска файла по фрагменту текста

Команда egrep

Метасимволы

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

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

Применение метасимволов […] и [!…]

Примеры .......


Команда grep (global regular expression print — печать глобальных регулярных выражений) наиболее известное инструментальное средство в UNIX и Linux. 

Выполняет поиск выражений в текстовых файлах или стандартном входном потоке, соответствующих шаблону, с последующим отображением результата на экране. 

Команда grep может работать как с базовыми, так и с расширенными регулярными выражениями, и совершенно очевидно что без знания/понимания регулярных выражений не возможно овладеть и таким инструментом как grep. Существует три разновидности этой команды:

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

Для наглядности создадим файл с именем data.f, содержащий информацию о заказах товаров. 


Разделителем полей является символ SPACE.

$ cat data.f

48   dec   3BC1997   LPSX  68.00   LVX2A 138

483  sept  5AP1996   USP   65.00   LVX2C 139

47   oct   3ZL1998   LPSX  43.00   KVM9D 512

219  dec   2CC1999   CAD   23.00   PLV2C  68

484  nov   7Р1Л996   CAD   49.00   PLV2C 234

483  may   5PA1998   USP   37.00   KVM9D 644

216 Sept   3ZL1998   USP   86.00   KVM9E 234

Структура записей этого файла такова:

1- й столбец — код города;

2- й столбец — код месяца, когда был сделан заказ;

3- й столбец — код заказа, включающий год, когда он был сделан;

4- й столбец — код товара;

5- й столбец — цена за единицу товара;

6- й столбец — код фирмы;

7- й столбец — количество заказанного товара;

Команда grep


Общий формат команды grep таков;  http://www.opennet.ru/man

grep [параметры] базовое_регулярное_выражение [файл]

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


Употребление кавычек


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

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

Шаблон поиска должен быть заключен в одинарные кавычки, если в состав регулярного выражения входят метасимволы.


Параметры команды grep


основные параметры команды grep;  http://www.gnu.org/savannah-checkouts/gnu/grep/man  и тут  https://aidalinux.ru/w/Grep    

   Задает отображение только числового значения, указывающего, сколько строк соответствуют шаблону 

-i     Дает указание игнорировать регистр символов

-h    Подавляет вывод имен файлов, включающих найденные строки (по умолчанию в выводе 

       команды grep каждой строке предшествует имя файла, в котором она содержится)

-l     Задает отображение только имен файлов, содержащих найденные строки

-n    Задает нумерацию выводимых строк

-s    Подавляет вывод сообщений о несуществующих или нетекстовых файлах

-v    Задает отображение строк, не соответствующих шаблону

-r     Поиск рекурсивно по всем файлам в указанной директории (читать и обрабатывать все файлы в  этом каталоге, рекурсивно, но пропустить символические ссылки, 

        которые  встречаются рекурсивно.)

-R    Читать и обрабатывать все файлы в этом каталоге, рекурсивно, соблюдая все символические  ссылки.

       Рекурсивный поиск - поиск чего либо в нескольких файлах, размещённых в одном каталоге или подкаталогах, поиск "внутри себя", с N-ым количеством вложений.

       Рекурсивный акроним — бэкроним, акроним который ссылается на себя.

Поиск среди нескольких файлов

Если в текущем каталоге требуется найти последовательность символов ¨sort¨ во всех файлах с расширением doc, выполните такую команду: 

$ grep sort *.doc

Следующая команда осуществляет поиск фразы ¨sort it¨ во всех файлах текущего каталога:

$ grep "sort it" *

Вывод номеров строк

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

$ grep -n "48" data.f

1:48 dec 3BC1997 LPSX 68.00 LVX2A 138

2:483 sept 5AP1996 USP 65.00 LVX2C 139

5:484 nov 7Р1Л996 CAD 49.00 PLV2C 234

6:483 may 5PA1998 USP 37.00 KVM9D 644

$

Поиск строк, не соответствующих шаблону

Благодаря опции -v можно отобрать те строки, которые не соответствуют шаблону. Следующая команда извлекает из файла data.f строки, не содержащие последовательность символов “48”:

$ grep -v "48" data.f

47 oct 3ZL1998 LPSX 43.00 KVM9D 512

219 dec 2CC1999 CAD 23.00 PLV2C 68

216 Sept 3ZL1998 USP 86.00 KVM9E 234

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

По умолчанию команда grep чувствительна к изменению регистра символов. Чтобы провести поиск без учета регистра, воспользуйтесь опцией -i. В файле data.f обозначение месяца Sept встречается как в верхнем, так и в нижнем регистре. Поэтому для отбора строк обоих видов следует применить такую команду:

$ grep -i "sept" data.f

483 sept 5AP1996 USP 65.00 LVX2C 139

216 Sept 3ZL1998 USP 86.00 KVM9E 234

Определение числа строк, в которых найдено совпадение

Опция позволяет узнать, сколько строк соответствуют заданному шаблону. Это может оказаться полезным в том случае, когда команда grep находит слишком много строк, и их лучше вывести в файл, а не на экран. Рассмотрим пример:

$ grep -c "48" data.f

4

$

Команда grep возвращает число 4. Эго означает, что в файле data.f обнаружены 4 строки, содержащие последовательность символов “48”. Следующая команда отображает эти строки:

$ grep "48" data.f

48 dec 3BC1997 LPSX 68.00 LVX2A 138

483 sept 5AP1996 USP 65.00 LVX2C 139

484 nov 7Р1Л996 CAD 49.00 PLV2C 234

483 may 5PA1998 USP 37.00 KVM9D 644

$

Поиск символов на границе слов

Как мы, заметили, что при поиске строк, содержащих последовательность символов “48”, были найдены строки заказов с кодом города не только 48, но также 483 и 484. Так что если необходимо найти заказ, у которого код города равен 48, добавьте в шаблон поиска символ табуляции:

$ grep "48 " data.f

48 dec 3BC1997 LPSX 68.00 LVX2A 138

В данном случае в качестве символа табуляции использовался SPACE, если не известно, какой пробельный символ является разделителем полей в файле, можно воспользоваться регулярным выражением \ > - признакам конца слова (если используются регулярные выражения следует употреблять одинарные кавычки):

$ grep '48\>' data.f

48 dec 3BC1997 LPSX 68.00 LVX2A 138

$

Команда grep и регулярные выражения

Без использования регулярных выражений функционал команды grep  сводится к минимуму. С помощью регулярных выражений можно задавать более сложные критерии фильтрации информации. При работе с регулярными выражениями следует заключать шаблон поиска в одинарные кавычки ('.'). Это позволит защитить все встречающиеся в нем специальные символы от интерпретатора shell, который в противном случае может "перехватывать" их у команды grep.

Выбор символов из списка

Предположим, требуется извлечь из файла data.f строки заказов, сделанных в городах, код которых равен 483 или 484. Поставленную задачу решает следующая команда:

$ grep '48[34]' data.f

483 sept 5AP1996 USP 65.00 LVX2C 139

484 nov 7Р1Л996 CAD 49.00 PLV2C 234

483 may 5PA1998 USP 37.00 KVM9D 644

Шаблон, соответствующий любому символу

Предположим, в файле data.f требуется найти коды фирм, которые начинаются на букву 'К' и заканчиваются буквой 'D'. Реализуется это следующим образом:

$ grep 'K...D' data.f

47 oct 3ZL1998 LPSX 43.00 KVM9D 512

483 may 5PA1998 USP 37.00 KVM9D 644

$

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

$ grep '[A-Z][A-Z]..C' data.f

483 sept 5AP1996 USP 65.00 LVX2C 139

219 dec 2CC1999 CAD 23.00 PLV2C 68

484 nov 7Р1Л996 CAD 49.00 PLV2C 234

$

Инверсия шаблона с помощью метасимвола ´^´

Следующая команда находит в файле data.f строки, не начинающиеся с цифры 4 или 8:

$ grep '^[^48]' data.f

219 dec 2CC1999 CAD 23.00 PLV2C 68

216 Sept 3ZL1998 USP 86.00 KVM9E 234

$

Символ '^', в квадратных скобках, говорит о том, что шаблон соответствует любому символу, кроме цифр 4 и 8. Символ '^' в начале шаблона — это признак того, что поиск производится с начала каждой строки.

Поиск по дате

Представленная ниже команда находит все заказы, которые были сделаны в 1996 или 1998 году и коды которых начинаются с цифры 5:

$ grep '5..199[68]' data.f

483 sept 5AP1996 USP 65.00 LVX2C 139

483 may 5PA1998 USP 37.00 KVM9D 644

$

Структура используемого здесь шаблона такова: первым символом является цифра 5, за ней следует два произвольных символа, затем число 199, а последним символом может быть либо цифра 6, либо цифра 8. Поиск всех заказов, сделанных в 1998 году, выполняется посредством следующей команды:

$ grep '[0-9]\{3\}8' data.f

47 oct 3ZL1998 LPSX 43.00 KVM9D 512

483 may 5PA1998 USP 37.00 KVM9D 644

216 Sept 3ZL1998 USP 86.00 KVM9E 234

$

Примененный в этом примере шаблон означает: найти любую последовательность из трех цифр, за которой идет цифра 8.

Комбинированные диапазоны

Допустим, необходимо найти строки, в которых код города имеет следующий формат: первым символом является произвольная цифра, второй символ выбирается из диапазона от 0 до 5, а третий символ принадлежит диапазону от 0 до 6. Воспользуемся следующей командой:

$ grep '[0-9][0-5][0-6]' data.f

47 oct 3ZL1998 LPSX 43.00 KVM9D 512

484 nov 7Р1Л996 CAD 49.00 PLV2C 234

483 may 5PA1998 USP 37.00 KVM9D 644

216 Sept 3ZL1998 USP 86.00 KVM9E 234

$

Как видно, отображается больше информации, чем нам необходимо. Значит, в шаблоне поиска недостаточно уточнен критерий отбора информации. Очевидно, следует указать, что поиск нужно начинать в начале строки. Для этого применим метасимвол '^':

$ grep '^[0-9][0-5][0-6]' data.f

216 Sept 3ZL1998 USP 86.00 KVM9E 234

$

Поиск повторяющихся последовательностей

Если необходимо найти какую-либо строку, которая содержит цифру 4, повторенную минимум дважды, задайте такую команду:

$ grep '4\{2,\}' data.f

483 may 5PA1998 USP 37.00 KVM9D 644

$

Запятая указывает, что предыдущий символ встречается не менее двух раз.

Вот как можно найти все записи, содержащие по крайней мере три девятки:

$ grep '9\{3,\}' data.f

219 dec 2CC1999 CAD 23.00 PLV2C 68

$

Иногда точное число повторений символа не известно. В таких случаях окажется полезной команда со следующей структурой:

$ cat myfile1

Привет! Я работаю за терминалом xterm

25-07-2015

мое имя imint

XX-ZZ-345.Y

1234567890

883567893

192.168.255.255

192.168.0.1

Пока!

88883888809321

8388456321

8456321


$ grep '8\{2,6\}3' myfile1

883567893

88883888809321

$

Здесь задан поиск строк, в которых цифра 8 встречается от двух до шести раз подряд и предшествует цифре 3.

Выбор из нескольких шаблонов

Опция позволяет использовать в команде grep синтаксис расширенных регулярных выражений. Предположим, необходимо найти все заказы с кодами городов 216 или 219. В этом случае можно воспользоваться метасимволом ´|´, задающим выбор из двух шаблонов:

$ grep -E '219|216' data.f

219 dec 2CC1999 CAD 23.00 PLV2C 68

216 Sept 3ZL1998 USP 86.00 KVM9E 234

$

Поиск пустых строк

Для поиска в файле пустых строк можно составить шаблон из метасимволов '^' и '$':

$ grep '^$' data.f

$

Поиск специальных символов

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

$ grep '\.' myfile1

XX-ZZ-345.Y

test^:'',"",..<-->,``-~~:;;;;::

192.168.255.255

192.168.0.1

271.125.211.13

$

Следующая команда ищет в файле myfile1 двойные кавычки:

$ grep '\"' myfile1

test^:'',"",..<-->,``-~~:;;;;::

$

А вот эта команда отбирает в листинге команды Is -l запись, соответствующую файлу procmail.log.

$ ls -l | grep 'procmail\.log'

-rw------- 1 imint imint 21149 июля 30 19:50 procmail.log

$

Поиск имен файлов, соответствующих заданному формату

Если наименования файлов в вашей системе или базе, подчинены определенному формату например: до шести символов, расположенных в начале, являются буквами нижнего регистра, далее следует точка, а завершают последовательность два символа верхнего регистра и если требуется найти имена файлов подобного типа, записанные в файле (базе) fllename.deposit, следует применить такую команду:

$ grep '[a-z]\{1,6\}\.[A-Z]\{1,2\}' filename.deposit

Или поиск в каталоге:

$ ls -l | grep '[a-z]\{1,6\}\.[a-z]\{1,2\}'

-rw-r--r-- 1 imint imint     1066 июля  22 15:30 account.err

-rw-r--r-- 1 imint imint       77 июля  22 15:41 accounts.err

-rw-r--r-- 1 imint imint      191 июля  22 15:41 accounts.out

-rw-r--r-- 1 imint imint      267 июля  30 14:46 data.f

-rw-r--r-- 1 imint imint      267 июля  30 22:27 data.f.save

-rw-r--r-- 1 imint imint      834 июля  22 14:15 files.out

-rw-r--r-- 1 imint imint        0 июля  22 14:21 file.zzz

-rw-r--r-- 1 imint imint        0 апр.  29 14:58 grep.cc

-rw-r--r-- 1 imint imint       71 июля  22 15:23 grep.err

-rw-r--r-- 1 root  root   1046957 окт.   9  2013 loganalyzer-3.6.5.tar.gz

-rw------- 1 imint imint  4447846 мая    4 23:04 nohup.out

-rw------- 1 imint imint    21283 июля  31 10:10 procmail.log

-rw-r--r-- 1 imint imint      268 июля  22 13:53 sort.out

-rwxrwxr-x 1 imint imint       32 июля  20 21:50 test.xxx

-rw-r--r-- 1 root  root  21833478 дек.  31  2014 webmin_1.730_all.deb

-rw-r--r-- 1 imint imint       90 июля  26 16:58 who.out

-rw-r--r-- 1 imint imint     1112 окт.  27  2013 xmobar.config

Поиск IP-адресов


$ cat -n myfile1

1 Привет! Я работаю за терминалом xterm

2 25-07-2015

3 мое имя imint

4 XX-ZZ-345.Y

5 1234567890

6 883567893

7 test^:'',"",..<-->,``-~~:;;;;::

8 192.168.255.255

9 192.168.0.1

10 Пока!

11 88883888809321

12 271.125.211.13

13 8388456321

14 8456321

15 25-12-2015


$ grep -n '[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3,\}\.[0-9]\{3,\}' myfile1

#Соответствует шаблону IP-адреса в формате ¨nnn.nnn.nnn.nnn¨

8:192.168.255.255

$ grep -n '[0-9]\{3\}\.[0-9]\{3\}\.' myfile1

#Соответствует шаблону IP-адреса в формате ¨nnn.nnn.¨

8:192.168.255.255

9:192.168.0.1

12:271.125.211.13

$ grep -n '[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{1,\}\.[0-9]\{1,\}' myfile1

#Соответствует шаблону IP-адреса в формате ¨nnn.nnn.⩾n.⩾n¨

8:192.168.255.255

9:192.168.0.1

12:271.125.211.13

......и тому подобное.

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

Возвращаемся к файлу myfile1:

$ cat myfile1

Привет! Я работаю за терминалом xterm

25-07-2015

мое имя imint

XX-ZZ-345.Y

1234567890

883567893

test^:'',"",..<-->,``-~~:;;;;::

192.168.255.255

192.168.0.1

Пока!

88883888809321

271.125.211.13

8388456321

8456321

25-12-2015

$



Следующая команда находит в нем слова, начинающиеся с буквы X, после которой идет произвольное число символов, а за ними — буква Y:

$ grep 'X.*Y' myfile1

XX-ZZ-345.Y

$

Показанная ниже команда отбирает слова, начинающиеся с буквы t, после которой идет произвольное число символов, затем — символ ':', а после нее — еще четыре символа:

$ grep 't.*:....' myfile1

test^:'',"",..<-->,``-~~:;;;;::

$

Следующая команда находит слова, в которых цифра '8' встречается не менее двух раз подряд:

$ grep '888*' myfile1

883567893

88883888809321

8388456321

$

Если требуется найти слово, которое стоит в конце строки, воспользуйтесь командой следующего вида:

$ grep 'imint' myfile1

мое имя imint

$

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

Команда grep поддерживает целый ряд предопределенных диапазонов символов, называемых классами. Обозначение класса состоит из открывающей квадратной скобки, двоеточия, собственно имени класса, двоеточия и закрывающей квадратной скобки. Поскольку класс представляет собой диапазон, обозначение класса дополнительно должно заключаться в квадратные скобки.

Классы и категории символов

Рассмотрим несколько примеров на базе файла data.f.

$ cat data.f

48    dec    3BC1997   LPSX   68.00   LVX2A   138

483  sept   5AP1996   USP     65.00   LVX2C   139

47     oct     3ZL1998   LPSX  43.00    KVM9D  512

219   dec    2CC1999   CAD   23.00   PLV2C     68

484   nov   7Р1Л996   CAD   49.00    PLV2C    234

483   may 5PA1998    USP    37.00    KVM9D  644

216   Sept  3ZL1998   USP    86.00    KVM9E    234



Предположим, требуется найти все заказы, которые содержат цифру 5, сопровождаемую по крайней мере двумя буквами в верхнем регистре:

$ grep '5[[:upper:]][[:upper:]]' data.f

483 sept 5AP1996 USP 65.00 LVX2C 139

483 may 5PA1998 USP 37.00 KVM9D 644

$

Вот как осуществляется поиск всех кодов товара, которые оканчиваются буквой ´D´ или ´X´:

$ grep '[[:upper:]][[:upper:]][DX]' data.f

48 dec 3BC1997 LPSX 68.00 LVX2A 138

483 sept 5AP1996 USP 65.00 LVX2C 139

47 oct 3ZL1998 LPSX 43.00 KVM9D 512

219 dec 2CC1999 CAD 23.00 PLV2C 68

484 nov 7Р1Л996 CAD 49.00 PLV2C 234

$

Другие примеры использования команды grep

В следующих примерах команда grep принимает по каналу результаты работы других команд, фильтруя их надлежащим образом.

Фильтрация списка файлов

Если требуется извлечь из списка файлов текущего каталога только подкаталоги, воспользуйтесь следующей командой:

$ ls -l | grep '^d'

drwxr-xr-x 2 imint imint 4096 марта 21 19:26 abby

drwx------ 4 imint imint 4096 апр. 22 12:13 Dropbox

drwxrwxr-x 5 root root 4096 окт. 9 2013 loganalyzer-3.6.5

drwx------ 2 imint imint 4096 июля 26 19:24 Mail

drwxr-xr-x 2 imint imint 4096 июля 27 17:01 scripts

drwxr-xr-x 3 imint imint 4096 марта 15 12:26 Видео

drwxr-xr-x 3 imint imint 4096 июля 20 21:20 Документы

drwxr-xr-x 2 imint imint 4096 мая 28 10:36 Загрузки

drwxr-xr-x 2 imint imint 4096 марта 10 23:05 Изображения

drwxr-xr-x 2 imint imint 4096 марта 10 23:05 Музыка

drwxr-xr-x 2 imint imint 4096 марта 10 23:05 Общедоступные

drwxr-xr-x 5 imint imint 4096 июля 30 12:27 Рабочий стол

drwxr-xr-x 2 imint imint 4096 марта 10 23:05 Шаблоны

$


Подавлание вывода сообщений об ошибках


Допустим, вы хотите найти запись пользователя imint в системном файле паролей:

$ grep imint /etc/passwd

imint:x:1000:1000:imint,,,:/home/imint:/bin/bash

$

Но вы забыли, как называется файл, потом подумали и написали:

$ grep imint /etc/password

grep: /etc/password: Нет такого файла или каталога

$

По скольку получается полная фигня, вы начинаете искать по всему каталогу:

$ grep imint /etc/*

grep: /etc/acpi: Это каталог

Двоичный файл /etc/aliases.db совпадает

grep: /etc/alternatives: Это каталог

grep: /etc/apache2: Это каталог

grep: /etc/apm: Это каталог

grep: /etc/apparmor: Это каталог

grep: /etc/apparmor.d: Это каталог

grep: /etc/apport: Это каталог

grep: /etc/apt: Это каталог

grep: /etc/at.deny: Отказано в доступе

grep: /etc/at-spi2: Это каталог

grep: /etc/avahi: Это каталог

grep: /etc/bash_completion.d: Это каталог

grep: /etc/blkid.tab: Нет такого файла или каталога

grep: /etc/bluetooth: Это каталог

grep: /etc/bonobo-activation: Это каталог

grep: /etc/brltty: Это каталог

grep: /etc/ca-certificates: Это каталог

grep: /etc/calendar: Это каталог

grep: /etc/chatscripts: Это каталог

grep: /etc/chromium-browser: Это каталог

grep: /etc/compizconfig: Это каталог

grep: /etc/conky: Это каталог

grep: /etc/ConsoleKit: Это каталог

grep: /etc/console-setup: Это каталог

grep: /etc/cracklib: Это каталог

grep: /etc/cron.d: Это каталог

grep: /etc/cron.daily: Это каталог

grep: /etc/cron.hourly: Это каталог

grep: /etc/cron.monthly: Это каталог

grep: /etc/cron.weekly: Это каталог

grep: /etc/cups: Это каталог

grep: /etc/cupshelpers: Это каталог

grep: /etc/dbconfig-common: Это каталог

grep: /etc/dbus-1: Это каталог

grep: /etc/default: Это каталог

grep: /etc/depmod.d: Это каталог

grep: /etc/dhcp: Это каталог

grep: /etc/dictionaries-common: Это каталог

.....................................................................

....и это реально жестко !!!! В подобной ситуации приходит на помощь опция -s, которая подавляет вывод сообщений об ошибках:

$ grep -s imint /etc/*

Двоичный файл /etc/aliases.db совпадает

/etc/group:root:x:0:imint

/etc/group:adm:x:4:syslog,imint,www-data

/etc/group:disk:x:6:imint

/etc/group:mail:x:8:imint

/etc/group:dialout:x:20:imint

/etc/group:fax:x:21:imint

...............................

/etc/group:imint:x:1000:

/etc/group:mysql:x:125:imint

/etc/group:debian-spamd:x:126:imint

/etc/hostname:imint-VB

/etc/hosts:127.0.0.1 imint-VB

/etc/hosts.mintNanny.backup:127.0.0.1 imint-VB

/etc/mtab:gvfsd-fuse /run/user/1000/gvfs fuse.gvfsd-fuse rw,nosuid,nodev,user=imint 0 0

/etc/passwd:imint:x:1000:1000:imint,,,:/home/imint:/bin/bash

/etc/subgid:imint:100000:65536

/etc/subuid:imint:100000:65536

$

...что уже вселяет надежду, а если ваша версия команды grep не поддерживает данную опцию, воспользуйтесь: следующей командой:

$ grep imint /etc/* 2> /dev/null

Эта команда направляет поток ошибок (2> (файловые дискрипторы)) в системную корзину (устройство /dev/null).


Удобно воспользоваться подсветкой вывода stderr:

$ grep user /etc/* 2> >(while read line; do echo -e "\e[01;31m$line\e[0m"; done)


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

 $ ls -l | grep '^[^d]'

итого 38824

-rw-r--r-- 1 imint imint 1066 июля 22 15:30 account.err

-rw-r--r-- 1 imint imint 77 июля 22 15:41 accounts.err

-rw-r--r-- 1 imint imint 191 июля 22 15:41 accounts.out

-rw-r--r-- 1 imint imint 267 июля 30 14:46 data.f

-rw-r--r-- 1 imint imint 267 июля 30 22:27 data.f.save

-rw-r--r-- 1 imint imint 20828 марта 21 19:39 en:download

......................................................................................................

-rw-r--r-- 1 imint imint 268 июля 22 13:53 sort.out

-rw-r--r-- 1 imint imint 0 июля 25 17:36 sudo

-rwxrwxr-x

-rw-r--r-- 1 imint imint 45 июля 23 13:11 textfile

-rw-r--r-- 1 imint imint 2603 июля 28 14:22 text_ls

-rw-r--r-- 1 root root 21833478 дек. 31 2014 webmin_1.730_all.deb

-rw-r--r-- 1 imint imint 90 июля 26 16:58 who.out

-rw-r--r-- 1 imint imint 1112 окт. 27 2013 xmobar.config

-rw-r--r-- 1 imint imint 1171 июля 25 19:07 xmobarrc

-rw------- 1 imint imint 588 июля 26 18:47 yes

-rw-r--r-- 1 imint imint 12236800 июля 26 17:11 zz-11

$

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

 ls -l | grep '^d.....x..x'

drwxr-xr-x 2 imint imint 4096 марта 21 19:26 abby

drwxrwxr-x 5 root root 4096 окт. 9 2013 loganalyzer-3.6.5

drwxr-xr-x 2 imint imint 4096 июля 27 17:01 scripts

drwxr-xr-x 3 imint imint 4096 марта 15 12:26 Видео

drwxr-xr-x 3 imint imint 4096 июля 20 21:20 Документы

drwxr-xr-x 2 imint imint 4096 мая 28 10:36 Загрузки

drwxr-xr-x 2 imint imint 4096 марта 10 23:05 Изображения

drwxr-xr-x 2 imint imint 4096 марта 10 23:05 Музыка

drwxr-xr-x 2 imint imint 4096 марта 10 23:05 Общедоступные

drwxr-xr-x 5 imint imint 4096 июля 30 12:27 Рабочий стол

drwxr-xr-x 2 imint imint 4096 марта 10 23:05 Шаблоны

$

Фильтрация списка процессов

Совместное применение команд grep и ps а позволяет выяснить, выполняется ли в системе некоторый процесс. Опция а команды ps задает вывод списка всех процессов, включая процессы других пользователей. Например, следующая, команда проверяет, выполняется ли в данный момент процесс mc:

$ ps a | grep mc

  47868 pts/1    S+     0:00 mc

  49132 pts/0    S+     0:00 grep mc

$

Выводимый результат включает также саму команду grep, поскольку она создает процесс, выполняющий фильтрацию текста в канале, и команда ps распознает этот процесс. Чтобы исключить команду grep из результата, задайте дополнительную команду grep с опцией -v:

$ ps a | grep mc | grep -v "grep"

  47868 pts/1    S+     0:00 mc

$

Еще один (эстетически совершенный) способ искличить grep из вывода:

$ ps a | grep [m]c

  47868 pts/1    S+     0:00 mc

$  

grep для поиска файла по фрагменту текста

$ grep 'text string' /directory/* 2> /dev/null

-R  рекурсия позволит искать в подкаталогах

-H  вывести только имена найденных grep файлов

$ grep -R 'text string' /directory/* 2> /dev/null

$ sudo grep -R 'teat message' /var/log/* 2> /dev/null

Двоичный файл /var/log/journal/58303ff724934c748cb510f817e6a86d/system.journal совпадает

Двоичный файл /var/log/journal/58303ff724934c748cb510f817e6a86d/user-1000.journal совпадает

$ ~ vim textfind

 #!/bin/bash

   #textfind

   cmd="find -type f -print "

   set_color_cmd="fish"

      if

      [ $2 ]; then cmd="$cmd -name \"$2\"";

      fi

   color="green"

      if

  [ $3 ]; then color=$3;

     fi

  is_colored=1

  hh=$(which "$set_color_cmd")

     if

     [ $? -ne 0 ]; then is_colored='';

     fi

     $cmd | while read f; do

     cnt=$(grep -c "$1" "$f")

     if

     [ $cnt -gt 0 ]; thenfish

     if [ $is_colored ]; then "$set_color_cmd" "$color"; fi

     echo "$f"

     if [ $is_colored ]; then "$set_color_cmd" normal; fi

     grep -n "$1" "$f"

     fi

  done

$ ~

В скрипте использована оболочка fish - "friendly interactive shell", использование которой конечно дело "индивидуальное": https://ubunlog.com/fish-linea-comandos-inteligente/ 

$ type fish

bash: type: fish: not found

$ sudo apt install fish

$ type fish

fish is /usr/bin/fish

$

Bind to "shortcuts":  /usr/bin/gnome-terminal -x fish

Команда egrep

Команда egrep (extended grep) воспринимает как базовые, так и расширенные регулярные выражения не поддерживая оператор \ { \}. Одной из привлекательных ее особенностей является возможность сохранения шаблонов поиска в файле. Подключается этот файл с помощью опции -f. Рассмотрим пример:

Создаем файл шаблона grepstrings:

$ cat >> grepstrings << !

> 484

> 47

> !

$ cat grepstrings

484

47

$

Применяем шаблон:

$ egrep -f grepstrings data.f

47 oct 3ZL1998 LPSX 43.00 KVM9D 512

484 nov 7Р1Л996 CAD 49.00 PLV2C 234

$

В приведенном примере в файле data.f осуществляется поиск записей, которые содержат последовательность символов “484” или “47”. Создание файла шаблонов удобно в том случае, когда шаблонов очень много и вводить их в командной строке затруднительно. Если шаблонов немного, воспользуйтесь метасимволом ´|´ который позволяет сделать выбор между несколькими шаблонами. Например, следующая команда ищет в файле data.f записи, содержащие последовательность символов “3ZL” или “2СС”:

$ egrep '3ZL|2CC' data.f

47 oct 3ZL1998 LPSX 43.00 KVM9D 512

219 dec 2CC1999 CAD 23.00 PLV2C 68

216 Sept 3ZL1998 USP 86.00 KVM9E 234

$

Метасимвол '|' можно применять более одного раза. Например, чтобы узнать, зарегистрированы ли в системе пользователи imint, root и nobody, выполните команду who и направьте результаты ее работы команде egrep:

$ who | egrep 'imint|root|nobody'

imint tty8 2015-07-31 09:02 (:0)

imint pts/2 2015-07-31 09:03 (:0.0)

imint pts/6 2015-07-31 16:29 (:0.0)

root tty7 2015-07-31 16:26 (:20)

Круглые скобки позволят представить выражение с несколькими шаблонами как один шаблон.

$ egrep --help 

Метасимволы

GREP конечно хорош, но зачастую удобнее пользоваться метасимволами. Метасимволы представляют собой универсальный инструмент поиска строк по шаблону. С их по-мощью легко находить нужные файлы и каталоги. Метасимволы используются как в составе регулярных выражений так и при обычном поиске файлов, имена которых соответствуют предложенному шаблону. Когда интерпретатор shell встречает указанные символы в командной строке, он обрабатывает их особым образом, если только вы не защитили их с помощью кавычек.

Список основных метасимволов:

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

Символ звездочки может служить заменой любой части имени файла. Следующая команда выводит список всех файлов, имена которых оканчиваются на ".txt" , а ниже имена которых начинаются на  "что надо":

$ ls *.txt

args.txt*      grade_student.txt  myfile.txt  parts.txt  town.txt     video_2.txt

blacklist.txt  grade.txt          names.txt   quote.txt  users.txt    video_3.txt

diary.txt      hdisk.txt          ok.txt      sedex.txt  video_1.txt  video.txt

Представленная ниже команда находит файлы, у которых имя начинается со строки "vi", а расширение равно .txt:

$ ls vi*.txt

video_1.txt  video_2.txt  video_3.txt  video.txt

Звездочку удобно применять, когда, например, не хочется вводить полное имя каталога при переходе в него:

$ cd /etc

/etc $ ls -l | grep ^d

.................................................

drwxr-xr-x  2 root     root                4.0K Feb 17  2021 compizconfig/

drwxr-xr-x  2 root     root                4.0K Feb 25  2021 conky/

drwxr-xr-x  2 root     root                4.0K Aug 21 16:44 console-setup/

drwxr-xr-x  2 root     root                4.0K Feb 24  2021 containerd/

drwxr-xr-x  2 root     root                4.0K Feb 17  2021 cracklib/

...............................................................

/etc $ cd conk*

/etc/conky $ 

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

Знак вопроса служит для замены любого отдельного символа. Следующая команда выводит список файлов, имена которых содержат не менее трех символов, причем третьим является символ 'e':

$ ls ??e*

age.awk*  beeep*  eeee  fieldcheck.awk*  grepif*  grepstr*  ifeditor*  users.txt

Следующая команда ищет файлы с именами, начинающимися с символов "po", за которой следуют три произвольных символа и расширение conf:

$ ls /etc/apache2/po???.conf

/etc/apache2/ports.conf

Вот как можно найти файлы, имена которых состоят не менее чем из четырех символов, причем первым является символ 'u', а последним - 't':

$ ls u??*t

users.txt

Применение метасимволов […] и [!…]

Метасимволы [… ] соответствуют любому символу из числа тех, что указаны в квадратных скобках. Представленная ниже команда выводит список файлов, имена которых начинаются с символа  'v' или 'x':

$ ls [vx]*

v_args*  vartest*  video_1.txt  video_2.txt  video_3.txt  video.txt  xaa  xab  xac  xxxx

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

$ ls log.[0-9]*

log.0323 log.0325 log.0324 log.0326

Метасимволы [!…] соответствуют любому символу из числа тех, что не указаны

в квадратных скобках. Если в предыдущем примере на первом месте в скобках поставить восклицательный знак, команда будет искать файлы с именами log, в расширении которых первый символ не является цифрой: 

$ ls log.[!0-9]*

log.sybase

Приведенная ниже команда ищет файлы, имена которых начинаются со строки "LPS", два следующих символа могут быть произвольными, затем идет символ, не являющийся цифрой, а за ним произволь-ная строка:

$ ls LPS??[!0-9]*

LPSILP LPSOSI 

LPSOPS LPSPOPQTR

Поиск файлов, имена которых начинаются с символа верхнего регистра, производится посредством такой команды:

$ ls [A‑Z]*

Следующая команда ищет файлы, имена которых, наоборот, начинаются с символа нижнего регистра:

$ ls [а–z]*

А эта команда находит файлы, в начале имени которых стоит цифра:

$ ls [0-9]*

Вот как можно найти все скрытые файлы (такие как .profile, .rhosts, .history и т. д.):

$ ls .*

Примеры .......

Commands using grep          <<<----сюда

grep pattern file.txt        поиск pattern в файле file.txt, с выводом полностью совпавшей строкой

grep -o pattern file.txt         поиск pattern в файле file.txt и вывод только совпавшего куска строки

grep -i pattern file.txt         игнорирование регистра при поиске

grep -bn pattern file.txt показать строку (-n) и столбец (-b), где был найден pattern

grep -v pattern file.txt         инверсия поиска (найдет все строки, которые не совпадают с шаблоном   (pattern))

grep -A 3 pattern file.txt вывод дополнительных трех строк, после совпавшей

grep -B 3 pattern file.txt вывод дополнительных трех строк, перед совпавшей

grep -C 3 pattern file.txt вывод три дополнительные строки перед и после совпавшей

grep -r pattern $HOME рекурсивный поиск по директории $HOME и всем вложенным

grep -c pattern file.txt         подсчет совпадений

grep -L pattern *.txt        вывести список txt-файлов, которые не содержат pattern

grep -l pattern *.txt        вывести список txt-файлов, которые содержат pattern

grep -w pattern file.txt          совпадение только с полным словом pattern

grep -f patterns.txt file.txt поиск по нескольким pattern из файла patterns.txt, шаблоны разделяются новой строкой

grep -I pattern file.txt         игнорирование бинарных файлов

grep -v -f file2 file1 > file3 вывод строк, которые есть в file1 и нет в file2

grep -in -e 'python' `find -type f` рекурсивный поиск файлов, содержащих слово python с выводом номера строки и совпадений

grep -inc -e 'test' `find -type f` | grep -v :0 рекурсивный поиск файлов, содержащих слово python с выводом количества совпадений

grep . *.py                                 вывод содержимого всех py-файлов, предваряя каждую строку именем  файла

grep "Http404" apps/**/*.py рекурсивный поиск упоминаний Http404 в директории apps в py файлах

http://www.rootfront.com/prakticheskih-primerov-komandy-grep-v-linux