При работе в командной строке невозможно обойтись без grep - очень полезная утилита для работы с текстом.
Сегодня мы рассмотрим несколько популярных опций, которые позволяют выполнять более продвинутую выборку.
Найти точное соответствие
Для того чтобы искать соответствия только целым словам, используйте флаг "-w":
$ ls
'test script.sh' test test_1 test_2
$ ls | grep -w test
test script.sh
test
Аналогичного результата можно добиться через регулярное выражение:
$ ls | grep "\<test\>"
test script.sh
test
"\<" — начало слова.
"test" — искомый текст.
"\>" — конец слова.
Угловые скобки должны экранироваться, иначе они будут интерпретироваться как простые символы.
Игнорировать регистр
По умолчанию, grep чувствительна к регистру, что немного мешает поиску. Проблема решается путем добавления ключа "-i" к команде:
ls | grep -i new
newFile
NewFile
Вывод файлов с совпадениями
Используйте параметр "-l", чтобы вывести не сами строки, а только пути к файлам, в которых они содержатся:
$ grep -r -l "libnma" /usr/share
/usr/share/doc/libnma-gtk4-0/copyright
Параметр "-r" отвечает за рекурсивный поиск - grep прошерстит не только 1 уровень каталога, а пойдет вглубь.
Поиск по нескольким параметрам
Для того, чтобы передать команде несколько вводных данных для определения совпадений, используется флаг "-e" перед каждым объектом поиска:
$ ls | grep -i -e new -e old
NewFile
newFile
oldFile
Эту команду система понимает, как "или-или" и выводит все вхождения указанных слов.
Использование регулярных выражений
Настоящая сила grep проявляется, когда вы переходите от сопоставления простых строк к сопоставлению шаблонов - регулярных выражений.
Выражения бывают 2 типов: basic и extended. Одна из особенностей второго типа заключается в том, что некоторые символы требуют экранирования для сохранности фич: ?, +, {, |, (, ), <, >.
Но можно обойтись просто добавлением флага "-E":
$ ls | grep -E "script|test"
1. Квадратные скобки "[]" используются, чтобы провести проверку на соответствие одному из указанных символов:
$ ls | grep "test[23]"
test2
test3
Можем указать "-" для того, чтобы использовать диапазон значений:
$ ls | grep "test[1-3]"
test2
test3
2. Каретка "^" используется для поиска строк, которые начинаются с указанного шаблона. Давайте найдем совпадение всех строк, начинающихся с заглавной буквы:
$ grep "^[A-Z]" myfile
A lot of text
Hello world
3. Знак доллара "$" означает конец строки. В результат входят только те элементы, конец которых подходит под шаблон:
$ grep "world$" myfile
Hello world
hello world
4. Точка "." обозначает любой одиночный символ, кроме новой строки. Регулярное выражение "....." обозначает любую строку, содержащую минимум 5 символов:
$ grep '.....' myfile
5. Вертикальная черта "|" выполняет роль логического оператора "ИЛИ":
$ ls | grep "script\|test"
script
test
В общем, регулярные выражения прекрасны и многообразны. Детальнее ознакомиться с ними можете по ссылке.
Экранирование
Иногда выражения приводят к неожиданным результатам.
Предположим, вы хотите найти в файле "myfile" только те строки, которые заканчиваются на ".sh".
Следующая команда выдаст неверный результат, поскольку точка — это регулярное выражение, означающее «любой символ»:
$ grep ".sh" myfile
script_name.sh
script_namesh
Чтобы обойти эту проблему, требуется экранировать спецсимвол:
$ grep "\.sh" myfile
script_name.sh
Такое решение иногда становится громоздким. К счастью, можно заставить grep забыть о регулярных выражениях и искать буквально то, что мы указываем.
Для этого используется параметр (fixed) "-F":
$ grep -F ".sh" myfile
script_name.sh
LinuxCamp | #utils
