Что такое GREP в Linux и как его использовать

Grep — это маленькая программа UNIX для поиска совпадающих шаблонов. Впервые выпущенная в V6 UNIX, вы теперь можете найти её почти в любой системе, похожей на UNIX, такой как Linux, macOS и даже BSD. В этой статье я расскажу об основах Grep и покажу вам несколько примеров, как использовать программу для повседневных задач.
Основы использования Grep
По своей сути, Grep — это простая и понятная программа. Она принимает входные данные, находит текст, который вы хотите в этих данных, и выводит найденные совпадения. Grep может обрабатывать практически любой неабстрактный текстовый источник. Это позволяет читать данные, поступающие из других команд, и просматривать файлы напрямую.
Самый простой способ начать работу с Grep — это чтение данных из текстового файла. Например, следующая команда выводит содержимое моего файла sample.txt:
grep'' sample.txtКроме того, вы можете использовать эту функцию для поиска и нахождения конкретных фрагментов текста внутри ваших текстовых файлов:
grep'word' sample.txt
Вы также можете использовать Grep с UNIX-каналами, позволяя вам соединять несколько программ в одной команде:
cat sample.txt |grep''
Важно знать: хотите расширить свои знания по UNIX? Узнайте, как работают экранные пейджеры в Linux, ознакомившись с нашим шпаргалкой для GNU less.
Поиск файлов в каталоге
Одна из самых простых задач, которые вы можете выполнить с помощью Grep, — это поиск файлов в списке каталогов. Для этого вы можете отправить вывод команды ls через UNIX-канал прямо в Grep.
Следующая команда выведет и выделит все файлы в вашей папке Загрузки с расширением .jpg:
ls ~/Downloads |grep \\.jpg
Вы также можете отправить более сложный вывод ls в Grep и использовать его для сопоставления шаблонов. Например, следующий код перечисляет все файлы в каталоге с размером менее 1 МБ:
ls-lh ./|grep .KИгнорирование регистра
По умолчанию почти все программы в системе, подобной UNIX, чувствительны к регистру. Это означает, что система воспринимает строку “Hello” иначе, чем “hello”, “hEllo” и “helLo”.

Такое поведение может стать проблемой при поиске строк внутри файлов. Например, эссе может содержать как “Hello”, так и “hello” одновременно. Чтобы решить эту проблему, запустите Grep с флагом -i, за которым следует строка, которую вы хотите найти.
grep-i Hello hello.txt
Рекурсивные поиски
Grep может производить поиск в более чем одном файле или каталоге одновременно. Это полезно, если вы работаете над проектом с несколькими файлами и хотите знать, где появляется строка текста в каталоге. Например, следующая команда находит слово “MakeTechEasier” внутри каталога “sample”:
grep-r'MakeTechEasier' ./sampleТем не менее, использование флага -r также заставит Grep искать во всех файлах в вашем целевом каталоге. Это может быть проблемой, если в папке, в которой вы ищете, также есть не текстовые файлы. Чтобы предотвратить это, запустите Grep с флагом -I:
grep-rI'MakeTechEasier' ./sampleК слову: узнайте, как можно создавать файлы в терминале, используя команду touch.
Сопоставление файлов, содержащих строку
Помимо отображения того, где конкретная строка встречается в разных файлах, вы также можете использовать Grep для создания списка файлов, которые содержат ваш целевой текст. Это полезно, если вы хотите знать, содержит ли файл определенную строку, но не хотите, чтобы Grep выводил каждое его вхождение в терминале.
Для этого запустите Grep с флагами -r и -l, за которыми следует строка, которую вы хотите сопоставить, и каталог, который вы хотите просмотреть:
grep-rl MakeTechEasier ./sampleВы даже можете заключить вашу команду Grep в подшелл Bash, чтобы создать несколько условий для вашего сопоставления текста. Например, следующая строка кода вернет только те файлы, которые содержат как “Hello”, так и “MakeTechEasier” в папке “sample”:
grep-rl MakeTechEasier $(grep-rl Hello ./sample)Найти противоположное
Помимо выполнения прямых поисков, Grep также может возвращать результаты, которые не соответствуют вашим первоначальным критериям. Это может показаться нелогичным в начале, но это может быть полезно в случаях, когда вам нужно выделить ошибки и аномалии в вашем текстовом вводе.
Для этого запустите Grep с флагом -v вместе с другими флагами, которые вы хотите активировать. Например, следующая команда рекурсивно просматривает все файлы в папке “/etc/nginx” и возвращает все строки, которые не содержат строку “nginx”:
grep-rv'nginx'/etc/nginx
Слова и строки
Также может быть полезно научить Grep искать целые слова или строки, а не что-то, содержащее определенный шаблон. Это полезно, если вы сопоставляете строку символов, которая распространена во множестве слов. Например, сопоставление слова “it” приведет к множеству ложных срабатываний, поскольку “it” — это распространенная строка, которая может встречаться в словах.
Чтобы исправить это, вы можете запустить Grep с флагом -w, за которым следует слово, которое вы хотите сопоставить:
cat it.txt |grep-w it
Вместо того чтобы выводить каждое слово, содержащее шаблон, Grep выведет только само слово. То же самое происходит и для целых строк с флагом -x, поэтому, если вы ищете фразу или единственную строку в конфигурационном файле, это может действительно помочь.
Добавление номеров строк в вывод Grep
Номера строк — важная часть отладки программ и корректуры текста. Это позволяет вам точно ссылаться на размещение конкретной функции или предложения, что значительно упрощает исправление и доработку.
В этом плане Grep имеет возможность выводить номера строк в своем стандартном выводе. Для этого запустите программу с флагом -n, за которым следует строка, которую вы хотите сопоставить:
grep-n main ./my-code.cС помощью UNIX-каналов вы также можете изменить вывод Grep и выводить только номера строк нужного вам текста. Это упрощает и облегчает разбор больших текстов:
grep-n Sed essay.txt |cut-f1-d :К сведению: UNIX-каналы — это не просто инструмент для Grep. Узнайте, как автоматизировать свои удаленные задачи с помощью создания и использования SSH-каналов.
Использование расширенного регулярного выражения с Grep
Grep использует набор метасимволов Основного Регулярного Выражения (BRE) для сопоставления и фильтрации строк текста. Хотя это обычно работает для большинства задач, некоторые пользователи могут найти это ограниченным, особенно при работе с группами шаблонов.
Для этого большинство реализаций Grep предоставляют флаг -E, который позволяет программе анализировать метасимволы Расширенного Регулярного Выражения (ERE). Например, следующая команда будет работать только с флагом -E:
printf"hello\nhellooooo\n"|grep-E .*o{2}$Примечание: версия GNU Grep использует некоторые функции ERE по умолчанию. Тем не менее, хорошей практикой является использование -E, всякий раз, когда вы используете ERE, для сохранения совместимости с другими системами, подобными UNIX.
Кроме того, Grep имеет специальный режим, который полностью исключает все функции Regex. Чтобы использовать это, запустите программу с флагом -F, за которым следует ваша простая строка:
grep-F[MakeTechEasier] ./fixed.txtДобавление соседних строк в вывод Grep
Одна из основных сильных сторон Grep — это возможность показать, где текст появляется в вашем файле или входном потоке. Тем не менее, бывают случаи, когда простое знание точного местоположения строки не помогает при устранении проблем. Например, журнал ошибок обычно предоставляет дополнительный контекст перед тем, как он выведет традиционное сообщение “Segmentation Fault”.
Одним из способов решения этой проблемы является выполнение Grep с флагом -C, за которым следует количество строк, которые вы хотите вывести вокруг вашей целевой строки. Следующая команда выведет пять строк до и после вашего совпадения текста:
grep-C5'Hello' ./hello-sample.txt
Вы также можете настроить, будет ли Grep выводить только контексты до совпадения или после с флагами -B и -A. Например, следующая команда выведет предыдущие10 строк после вашей целевой строки:
grep-A10'Hello' ./hello-sample.txt
Теперь, имея под рукой основы Grep и как его использовать для повседневных задач, вы можете сделать свой первый шаг в освоении командной строки и основных утилит UNIX. Исследуйте больше этого очень разнообразного и глубоко проблематичного мира, узнав, как работает sed в Linux.