🐧 16 опций grep, которые помогут вам в реальном мире
Эта популярная утилита умеет не только искать в файле соответствующие шаблону строки. Рассмотрим некоторые из часто используемых в различных ситуациях опций grep, которые пригодятся сисадмину и разработчику.
Перевод публикуется с сокращениями, автор оригинальной статьи Abhishek
Nair.
Название утилиты расшифровывается как Globally search for a REgular expression and Print matching lines. Grep в основном ищет заданный шаблон или регулярное выражение из стандартного ввода или файла и печатает соответствующие заданным критериям строки. Он часто используется для фильтрации ненужных деталей при выводе только необходимой информации из больших файлов журналов.
Мощь регулярных выражений в сочетании с поддерживаемыми опциями в grep делает это возможным.
Начнем!
Синтаксис команды
Grep ожидает шаблон и
необязательные аргументы вместе со списком файлов, если они используются без
конвейера.
Пример:
1. Поиск в нескольких файлах
Grep позволяет искать
заданный шаблон не только в одном, но и в нескольких файлах с помощью масок (например, знака «*»):
Вывод:
Из приведенного вывода
можно заметить, что grep печатает имя файла перед соответствующей строкой, чтобы
указать местонахождение шаблона.
2. Поиск без учета регистра
Grep предлагает искать
паттерн, не глядя на его регистр. Используйте флаг -i, чтобы утилита игнорировала регистр:
Вывод:
3. Поиск всего слова
Зачастую вместо
частичного совпадения необходимо полное соответствие поисковому слову. Это можно
сделать, используя флаг -w:
Вывод:
4. Проверка количества совпадений
Иногда вместо
фактического совпадения со строкой нам необходимо количество успешных
совпадений, найденных grep. Этот результат можно получить, используя опцию -c:
Вывод:
5. Поиск в подкаталогах
Часто требуется выполнить
поиск файлов не только в текущем рабочем каталоге, но и в подкаталогах. Grep позволяет это сделать с помощью флага -r:
Вывод:
Как можно заметить,
grep проходит через каждый подкаталог внутри текущего каталога и перечисляет
файлы и строки, в которых найдено совпадение.
6. Инверсивный поиск
Если вы хотите найти
что-то несоответствующее заданному шаблону, grep и это умеет при помощи флага -v:
Вывод:
Можно сравнить вывод
команды grep по одному и тому же шаблону и файлу с флагом -v или без него. С флагом печатается каждая строка, которая
не соответствует шаблону.
7. Печать номеров строк
Если хотите напечатать
номера найденных строк, чтобы узнать их позицию в файле, используйте
опцию -n:
Вывод:
8. Ограниченный вывод
Для больших файлов вывод может быть огромным и тогда вам понадобится
фиксированное количество строк вместо всей простыни. Можно использовать -m[num]:
Обратите внимание, как
использование флага влияет на вывод для того же набора условий:
9. Отображение дополнительных строк
Иногда необходимо
вывести не только строки по некоторому шаблону, но и дополнительные строки выше
или ниже найденных для понимания контекста. Можно напечатать строку выше, ниже или оба варианта, используя флаги -A, -B или -C со значением num (количество дополнительных строк, которые будут напечатаны). Это применимо ко всем совпадениям, которые grep находит в указанном файле или в списке файлов.
или
или
Ниже показан обычный
вывод grep, а также вывод с флагами. Обратите внимание, как grep интерпретирует флаги и их значения, а также
изменения в соответствующих выходных данных:
с флагом -A1 выведется 1 строка, следующая за основной;
-B1 напечатает 1 строку перед основной;
-C1 выведет по одной строке снизу и сверху.
10. Список имен файлов
Чтобы напечатать только
имя файлов, в которых найден шаблон, используйте флаг -l:
Вывод:
11. Точный вывод строк
Если необходимо
напечатать строки, которые точно соответствуют заданному шаблону, а не какой-то
его части, применяйте в команде ключ -x:
В приведенном ниже
примере file.txt содержится слово «support», а строки без точного совпадения
игнорируются.
12. Совпадение по началу строки
Используя регулярные
выражения, можно найти начало строки:
Пример:
Обратите внимание, как
использование символа «^» изменяет выходные данные. Знак «^» указывает начало
строки, т.е. ^It соответствует любой
строке, начинающейся со слова It.
Заключение в кавычки может помочь, когда шаблон содержит пробелы и т. д.
13. Совпадение по концу строки
Эта полезная регулярка
способна помочь найти по шаблону конец строки:
Пример:
Обратите внимание, как
меняется вывод, когда мы сопоставляем символ «.» и когда используем «$», чтобы сообщить утилите о строках, заканчивающихся на «.» (без тех, которые могут содержать
символ посередине).
14. Файл шаблонов
Если у вас есть некий
список часто используемых шаблонов, укажите его в файле и используйте флаг -f. Файл должен содержать по одному шаблону на строку.
В примере мы создали файл
шаблонов pattern.txt с таким содержанием:
Чтобы это использовать,
применяйте ключ -f:
15. Указание нескольких шаблонов
Grep позволяет указать
несколько шаблонов с помощью -e:
Пример:
16. Расширенные выражения
Grep поддерживает
расширенные регулярные выражения или ERE (похожие на egrep) с использованием флага -E.
Использование ERE имеет
преимущество, когда вы хотите рассматривать мета-символы как есть и не хотите
заменять их строками. Использование -E
с grep эквивалентно команде egrep.
Вот одно из применений
ERE, когда необходимо вывести строки, например, из больших конфигурационных
файлов. Здесь использовался флаг -v,
чтобы не печатать строки, соответствующие шаблону ^(#|$).
Заключение
Приведенные выше
примеры – лишь верхушка айсберга. Grep поддерживает
целый ряд опций и может оказаться полезным инструментом в руках специалиста,
который способен эффективно его использовать. Мы можем не только взять на вооружение приведенные выше примеры, но и комбинировать их, чтобы получить требуемый
результат в различных условиях.
Для дальнейшего
изучения утилиты и расширения кругозора стоит почитать мануал, выполнив в
терминале команду man grep, или
посетить страницу с официальной документацией.