Семейство команд grep
Оглавление
Поиск строк, не соответствующих шаблону
Игнорирование регистра символов
Определение числа строк, в которых найдено совпадение
Поиск символов на границе слов
Команда grep и регулярные выражения
Шаблон, соответствующий любому символу
Инверсия шаблона с помощью метасимвола ´^´
Поиск повторяющихся последовательностей
Поиск имен файлов, соответствующих заданному формату
Поиск строк с использованием подстановочных знаков
Другие примеры использования команды grep
Подавлание вывода сообщений об ошибках
grep для поиска файла по фрагменту текста
Применение метасимволов […] и [!…]
Команда grep (global regular expression print — печать глобальных регулярных выражений) наиболее известное инструментальное средство в UNIX и Linux.
Выполняет поиск выражений в текстовых файлах или стандартном входном потоке, соответствующих шаблону, с последующим отображением результата на экране.
Команда grep может работать как с базовыми, так и с расширенными регулярными выражениями, и совершенно очевидно что без знания/понимания регулярных выражений не возможно овладеть и таким инструментом как grep. Существует три разновидности этой команды:
grep — стандартный вариант.
egrep — работает с расширенными регулярными выражениями (не поддерживает оператор \ { \}).
fgrep — быстрый вариант команды 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