Одна из основных концепций Linux заключается в том, что все в этой ОС – файл. Причем большинство этих файлов plaintext, то есть простые текстовые файлы. Это могут быть файлы конфигураций, логов и прочее.
Администрируя Linux сервер вы будете часто работать с такими файлами, а значит нужно уметь отыскать в них нужную информацию.
Команда grep станет вашим надежным помощником в этом деле. Она позволяет искать нужные слова или фразы в файлах и выводить только те строки, которые соответствуют вашему запросу.
В этой статье я расскажу о 10 самых основных случаев применения команды grep и на примерах объясню, как их применять.
Что такое команда grep?
Команда grep — это инструмент для поиска текста внутри файлов. Она ищет строки, содержащие определённое слово или фразу, и выводит их на экран.
Это очень удобно, когда нужно быстро найти нужную информацию в больших файлах или логах.
Базовый вид команды:
grep [-параметры] искомая_строка место_поиска
Примеры использования команды grep
- 1. Поиск слова в файле
- 2. Игнорировать регистр при поиске
- 3. Поиск во всех файлах определённого типа
- 4. Поиск с выводом номеров строк
- 5. Исключение строк по условию
- 6. Поиск с использованием регулярных выражений
- 7. Поиск рекурсивно по папкам
- 8. Использование команды grep вместе с другими командами
- 9. Поиск целых слов
- 10. Подсчёт количества совпадений
У нас заготовлена площадка для практики. В основной директории три файла и один файл в подпапке:
[root@waky example]# ls -R
.:
dir file1.txt file2.txt file3.log
./dir:
file4.txt
У всех файлов одинаковое содержание:
[root@waky example]# cat file1.txt
test
Test
contest
test
Context
test
Text
Protest
text
test
texture
texT
Самое время переходить непосредственно к примерам.
1. Поиск слова в файле
Самый первый и самый простой пример использования grep — найти все строки в файле, где встречается вхождение заданной строки:
[root@waky example]# grep test file1.txt
test
contest
test
Protest
test
[root@waky example]#
Мы ищем вхождения test в конкретном файле file1.txt Никаких дополнительных параметров не используем.
Кроме самого test в выдачу попали contest и Protest, так как обе строки содержат в себе часть test .
Однако, вы наверняка заметили, что в выдаче отсутствуют строки Test и teSt. Поиск grep чувствителен к регистру.
2. Игнорировать регистр при поиске
Чтобы искать независимо от регистра, добавьте ключ -i тогда, grep сочтет строку подходящей несмотря на размер буквы:
[root@waky example]# grep -i test file1.txt
test
Test
contest
test
test
Protest
test
[root@waky example]#
Теперь вывод включает в себя все вариации test независимо от регистра.
3. Поиск во всех файлах определённого типа
Искать по отдельным файлам не всегда рационально. Администрируя сервер часто приходится проверять однотипные файлы, например логи.
Если нужно найти строку во всех файлах одного типа используйте wildcard:
[root@waky example]# grep test *.txt
file1.txt:test
file1.txt:contest
file1.txt:test
file1.txt:Protest
file1.txt:test
file2.txt:test
file2.txt:contest
file2.txt:test
file2.txt:Protest
file2.txt:test
[root@waky example]#
Значок * использованный вместо части имени файла означает, что на его месте может быть любое количество символов. Так grep прошелся по всем файлам с .txt на конце, исключив из поиска file3.log
4. Поиск с выводом номеров строк
Если поиск осуществляется по большому файлу, полезно знать номер строки, где найдено вхождение. Чтобы знать, где именно в файле находится искомая строка, используйте ключ -n:
[root@waky example]# grep -n test file1.txt
1:test
3:contest
4:test
8:Protest
10:test
[root@waky example]#
В результате вывод будет дополнен номерами строк.
5. Исключение строк по условию
Бывают ситуации когда важнее найти строки которые не соответствуют условиям поиска. Если нужно вывести все строки, которые не содержат определённое слово, используйте ключ -v:
[root@waky example]# grep -v test file1.txt
Test
Context
test
Text
text
texture
texT
[root@waky example]#
Вывод содержит все строки без вхождения test.
6. Поиск с использованием регулярных выражений
Команда grep отлично работает с регулярными выражениями. Например, чтобы найти все строки, начинающиеся и заканчивающиеся на t:
[root@waky example]# grep "^t.*t$" file1.txt
test
test
test
text
test
[root@waky example]#
^ – символ следующий после, должен стоять в начале строки
$ – символ стоящий перед, должен быть в конце строки
.* – любое количество любых символов
Использование регулярных выражений с grep это большая и комплексная тема, достойная отдельной статьи.
7. Поиск рекурсивно по папкам
Если нам не нужно ограничиваться отдельными файлами, а нужно искать по всем файлам внутри папки и её подкаталогах, используйте параметр -r:
[root@waky example]# grep -r test ./
./file2.txt:test
./file2.txt:contest
./file2.txt:test
./file2.txt:Protest
./file2.txt:test
./dir/file4.txt:test
./dir/file4.txt:contest
./dir/file4.txt:test
./dir/file4.txt:Protest
./dir/file4.txt:test
./file1.txt:test
./file1.txt:contest
./file1.txt:test
./file1.txt:Protest
./file1.txt:test
./file3.log:test
./file3.log:contest
./file3.log:test
./file3.log:Protest
./file3.log:test
[root@waky example]#
./ – означает текущую директорию
Вывод содержит как файлы из самой директории, так и из поддиректории dir.
8. Использование команды grep вместе с другими командами
Можно использовать команду grep вместе с командой | (пайп) для поиска по результатам другой команды. Например, выведем список файлов в текущей директории и выберем строки содержащие file:
[root@waky example]# ls | grep file
file1.txt
file2.txt
file3.log
[root@waky example]#
Команда grep работает с любым текстом, в данном примере текстом для обработки служит вывод команды ls.
Таким образом, grep можно использовать не только с другими командами, но и с самим собой. Это позволяет посредствам нескольких отборов сократить конечную выдачу:
[root@waky example]# grep test file1.txt
test
contest
test
Protest
test
[root@waky example]# grep test file1.txt | grep -v o
test
test
test
[root@waky example]#
В первом случае мы получаем выдачу всех строк содержащих test. А во втором, к этому выводу применяем еще один поиск, и из первого вывода убираем строки содержащие o.
9. Поиск целых слов
Чтобы искать только целое слово (например, чтобы не находить совпадения внутри других слов), используйте параметр -w:
[root@waky example]# grep -w test file1.txt
test
test
test
[root@waky example]#
Это найдёт только слова test, но не вхождения contest и Protest.
10. Подсчёт количества совпадений
Если нужно узнать сколько раз встречается вхождение в файле, используйте ключ -c:
[root@waky example]# grep -c test file1.txt
5
[root@waky example]#
Это покажет число строк, содержащих в которых присутствует вхождение test.
Комбинирование нескольких ключей
Не всегда достаточно одного условия, чтобы провести достаточный поиск. К счастью grep легко совмещает несколько параметров в одной команде. Например:
[root@waky example]# grep -iw test file1.txt
test
Test
test
test
test
[root@waky example]#
Регистронезависимый (–i) поиск, целых слов (–w) test.
Или:
[root@waky example]# grep -nv test file1.txt
2:Test
5:Context
6:test
7:Text
9:text
11:texture
12:text
[root@waky example]#
Регистрозависимый поиск строк, не содержащих (–v) test, с номером строки (–n)
Не бойтесь комбинировать разные условия, это поможет вам сузить результат поиска, а значит и время на его обработку.
Заключение
Команда grep — очень мощный инструмент для поиска информации в Linux. Она помогает быстро находить нужные данные в текстовых файлах и логах.
Мы рассмотрели базовые примеры применения grep, их уверенное использование составляет практическую основу работы с текстовой информацией в Linux.