Перевод статьи «How to Search for a File in Linux and Unix with Recursive Find».
Для поиска заданного шаблона в файле или группе файлов в системах 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' в папках #и файлах, начиная #с текущей директории
Применение регулярных выражений в шаблонах
Команда 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).
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]