Команда grep выполняет поиск в файле с использованием регулярных выражений. Она имеет следующий формат:
grep [OPTIONS] PATTERNS [FILE]
В качестве обязательного аргумента PATTERNS она принимает шаблон текста, который надо найти. Если команде передан аргумент FILE, то он используется в качестве файла для поиска текста. И необязательный параметр OPTIONS позволяет настроить применение шаблона для поиска текста.
Например, найдем текст "127.0." в файле /etc/hosts
:
eugene@Eugene:~$ grep "127.0." /etc/hosts 127.0.0.1 localhost 127.0.1.1 Eugene
Другой пример - найдем в домашнем каталоге пользователя папки и файлы, названия которых начинаются на "Do":
eugene@Eugene:~$ ls ~ | grep "Do" Documents Downloads
Основные элементы регулярных выражений:
^
: указывает, что соответствие шаблону должно находиться в начале строки. Например, найдем строки, которые начинаются на символ "s":
eugene@Eugene:~$ ls ~ | grep "^s" shell snap
$
: указывает, что соответствие шаблону должно находиться в конце строки. Например, найдем все файлы с расширением "txt":
ls ~ | grep "\.txt$"
.
: соответствует любому символу. Например, пусть в домашнем каталоге пользователя у нас есть следующий файл test.txt
Tom Bob Sam Alice Kate Tim Tomas
Найдем все строки, которые содержат "Tim" или "Tom":
eugene@Eugene:~$ grep "T.m" test.txt Tom Tim Tomas
[]
: указывает символы в регулярном выражении, которые следует интерпретировать как альтернативы. Например, найдем все строки, которые содержат "Tum" или "Tom":
grep "T[ou]m" test.txt
[^ ]
: игнорирует все символы после знака ^. Например, найдем все строки, которые НЕ содержат "Tum" или "Tom":
grep "T[^ou]m" test.txt
-
: определяет диапазон символов, которому должен соответствовать символ. Например, найдем все строки, которые начинаются с цифрового символа:
grep "^0-9" test.txt
\
: позволяет экранировать спец. символы. Например, символ точки . рассматривается как заменитель произвольного символа. Но если нам надо указать, что текст
должен содержать именно точку как стандартный символ, то нам надо использовать "\.". Например, найдем в папке загрузок все файлы, которые имеют расширение tar.gz
:
ls ~/Downloads | grep "\.tar\.gz"
*
: указывает, что предыдущее регулярное выражение может встречаться один раз, несколько раз или не встречаться вообще
?
: указывает, что предыдущее регулярное выражение может встречаться один раз или может отсутствовать
+
: указывает, что предыдущее регулярное выражение может встречаться один или более раз
\{n\}
: указывает, что предыдущий символ может встречаться как минимум n раз. Например, найдем строки, где есть два буквы o подряд:
grep "o\{2\}" test.txt