Поиск в Unix: команда grep

0
375
views

Перевод статьи «How to Search for a File in Linux and Unix with Recursive Find».

Photo by Rabie Madaci on Unsplash

Для поиска заданного шаблона в файле или группе файлов в системах UNIX и Linux используется инструмент командной строки grep.

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

Как использовать grep

Если команде grep не заданы никакие дополнительные опции, она осуществляет поиск заданного шаблона в файле (или файлах). Синтаксис команды следующий:

grep '<текст-который-нужно-найти>'
<файл/файлы>

Обратите внимание: когда в вашем шаблоне больше одного слова, его следует взять в одинарные или двойные кавычки.

Чтобы искать указанный текст во всех файлах директории, можно использовать астериск (*).

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

Возьмем пример. Допустим, у нас есть файл (назовем его grep.txt), содержащий такие строки:

Hello, how are you
I am grep
Nice to meet you

Команда, приведенная ниже, будет искать все вхождения слова you в этом файле.

grep you grep.txt

Результат:

Hello, how are you
Nice to meet you

Слово you скорее всего будет выделено другим цветом — чтобы ясно обозначить, что именно запрашивалось при поиске.

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

Использование команды grep с дополнительными опциями

1. -n (—line-number) — вывод строк с их номерами

Если в предыдущую команду добавить опцию -n, в выводе будут обозначены номера строк, в которых встречается искомое слово (сравните с предыдущим результатом).

grep you grep.txt -n

Результат:

1: Hello, how are you
3: Nice to meet you

2. -c (—count) — вывод числа строк, в которых найдено соответствие с шаблоном

grep you grep.txt -c

Результат:

2

Обратите внимание: если бы в одной строке было найдено два совпадения с шаблоном, в выводе все равно было бы 2. Команда подсчитывает число строк, а не число вхождений.

3. -v (—invert-match) — выводит строки, в которых не найден искомый шаблон

grep you grep.txt -v -n

Результат:

2: I am grep 

Вы заметили, что мы также использовали опцию -n? Все верно, вы запросто можете комбинировать разные опции в одной команде.

4. -i (—ignore-case) — инструкция игнорировать регистр

#command 1
grep You grep.txt
#command 2
grep YoU grep.txt -i

Результаты:

#result 1
no result
#result 2
Hello, how are you
Nice to meet you

5. -l (—files-with-matches) — вывод не строк, содержащих искомый шаблон, а имен файлов, в которых есть такие строки

#command 1
grep you grep.txt -l
#command 2
grep You grep.txt -i -l

Результат:

#result 1
grep.txt
#result 2
все файлы в текущей директории,
содержащие текст 'You' в любом регистре

6. -w (—word-regexp) — поиск предполагает, что заданный шаблон должен быть целым отдельным словом

По умолчанию grep ищет все строки, в которых встречается заданный шаблон (в том числе, если заданная последовательность символов является частью более длинного слова). Таким образом, grep yo grep.txt и grep you grep.txt дадут одинаковые результаты, потому что в слове «you» содержится «yo» (с «ou» ситуация будет аналогичной).

Но если добавить опцию -w, grep будет учитывать только вхождения заданного шаблона как целого слова. Например:

grep yo grep.txt -w

Результат:

Результата нет!

7. -o (—only-matching) — вывод только найденного совпадения с шаблоном

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

grep yo grep.txt -o

Результат:

yo

8. -A (—after-context) and -B (—before-context) — вывод строк, идущих перед или после строки с искомым словом

grep grep grep.txt -A 1 -B 1

Результат:

Hello, how are you
I am grep
Nice to meet you

Совпадение с шаблоном было найдено в строке № 2. Благодаря опции -A 1 мы получили одну строку перед строкой № 2, а благодаря опции -B 1 — одну строку после нее. (Число указывает, сколько конкретно строк до и после вхождения шаблона нужно вывести. Т.е., могло быть -A 5 и -B 2. — Прим. ред. Techrocks).

Есть еще опия -C (--context), эквивалентная одновременному использованию опций -A и -B. Число, указанное при опции -C, будет касаться количества строк и до, и после вхождения. (Т.е., если вы укажете grep you grep.txt -C 5, это будет эквивалентно grep you grep.txt -A 5 -B 5. — Прим. ред. Techrocks).

9. -R (—dereference-recursive) — рекурсивный поиск

По умолчанию grep не ищет в шаблон в директориях. При попытке сделать это вы получите ошибку «Is a directory». Опция -R делает возможным поиск в директориях и вложенных директориях. Например:

grep you .

Результат:

#Совпадения с 'you' в папках
#и файлах, начиная
#с текущей директории
Photo by Anthony Martino on Unsplash

Применение регулярных выражений в шаблонах

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

1. ^шаблон — строка должна начинаться с заданного шаблона

При таком определении шаблона grep будет искать строки, которые начинаются со слова (слов), стоящего после символа ^. Например:

grep ^I grep.txt -n

Результат:

2: I

2. шаблон$ — строка должна заканчиваться указанным шаблоном

При такой записи grep будет искать строки, оканчивающиеся на слово (слова) в шаблоне. Например:

grep you$ grep.txt

Результат:

1: Hello, how are you
3: Nice to meet you

Заключение

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

Конечно, мы рассмотрели не все опции этой команды. С остальными вы можете ознакомиться в руководстве (man grep).

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here