Как использовать команду grep в Linux

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

История grep

Команда grepизвестна в кругах Linux и Unix по трем причинам. Во-первых, это чрезвычайно полезно. Во-вторых, количество вариантов может быть огромным. В-третьих, он был написан в одночасье, чтобы удовлетворить определенную потребность. Первые два удачливы; третий немного выключен.

Кен Томпсон извлек из edредактора возможности поиска по регулярным выражениям (произносится как ee-dee) и создал небольшую программу - для собственного использования - для поиска в текстовых файлах. Начальник отдела Bell Labs Дуг Макилрой подошел к Томпсону и описал проблему, с которой столкнулся один из его коллег, Ли МакМахон.

МакМахон пытался определить авторов статей федералистов с помощью текстового анализа. Ему нужен был инструмент, который мог бы искать фразы и строки в текстовых файлах. В тот вечер Томпсон потратил около часа на то, чтобы сделать свой инструмент универсальной утилитой, которую могли бы использовать другие, и переименовал его в grep. Он взял имя из edкомандной строки g/re/p, что переводится как «глобальный поиск по регулярному выражению».

Вы можете посмотреть, как Томпсон разговаривает с Брайаном Керниганом о рождении grep.

Простой поиск с помощью grep

Чтобы найти строку в файле, передайте поисковый запрос и имя файла в командной строке:

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

псевдоним grep = "grep --colour = auto"

Давайте посмотрим на результаты, в которых есть несколько совпадающих строк. Мы будем искать слово «Среднее» в файле журнала приложения. Поскольку мы не можем вспомнить, находится ли слово в нижнем регистре в файле журнала, мы будем использовать параметр -i (игнорировать регистр):

grep -i Средний компьютерщик-1.log

Отображаются все совпадающие строки, в каждой из которых выделяется соответствующий текст.

Мы можем отобразить несовпадающие строки, используя параметр -v (инвертировать совпадение).

grep -v Mem geek-1.log

Выделения нет, потому что это несовпадающие строки.

Мы можем заставить grepзамолчать. Результат передается в оболочку как возвращаемое значение из grep. Нулевой результат означает, что строка была найдена, а результат, равный единице, означает, что она не найдена. Проверить код возврата можно с помощью  $?специальных параметров:

grep -q средний geek-1.log
эхо $?
grep -q howtogeek geek-1.log
эхо $?

Рекурсивный поиск с помощью grep

Для поиска во вложенных каталогах и подкаталогах используйте параметр -r (рекурсивный). Обратите внимание, что вы не указываете имя файла в командной строке, вы должны указать путь. Здесь мы ищем в текущем каталоге «.» и любые подкаталоги:

grep -r -i memfree.

Вывод включает каталог и имя файла каждой совпадающей строки.

Мы можем заставить  grep  следовать символические ссылки, используя -Rопцию (рекурсивное разыменование). У нас есть символическая ссылка в этом каталоге с именем logs-folder. Это указывает на /home/dave/logs.

ls -l папка журналов

Повторим наш последний поиск с  -Rопцией (рекурсивное разыменование):

grep -R -i memfree.

Переход по символической ссылке и поиск в каталоге, на который она указывает grep.

Поиск целых слов

По умолчанию grepбудет соответствовать строке, если цель поиска появляется в любом месте этой строки, в том числе внутри другой строки. Взгляните на этот пример. Мы будем искать слово «бесплатно».

grep -i бесплатно компьютерщик-1.log

Результатом являются строки, в которых есть «свободная» строка, но это не отдельные слова. Они являются частью строки «MemFree».

Чтобы принудительно grep сопоставлять только отдельные «слова», используйте -wопцию (word regexp).

grep -w -i бесплатно компьютерщик-1.log
эхо $?

На этот раз результатов нет, потому что поисковый запрос «бесплатно» не отображается в файле как отдельное слово.

Использование нескольких поисковых запросов

Параметр -E(расширенное регулярное выражение) позволяет искать несколько слов. (Эта -Eопция заменяет устаревшую egrepверсию grep.)

Эта команда выполняет поиск двух условий поиска: «средний» и «без памяти».

grep -E -w -i "средний | memfree" geek-1.log

Все совпадающие строки отображаются для каждого условия поиска.

Вы также можете искать несколько терминов, которые не обязательно являются целыми словами, но могут быть и целыми словами.

Параметр -e(шаблоны) позволяет использовать несколько условий поиска в командной строке. Мы используем функцию скобок регулярного выражения для создания шаблона поиска. Он сообщает, что grepнужно сопоставить любой из символов, содержащихся в скобках «[]». Это означает grep, что при поиске будет найдено соответствие либо «kB», либо «KB».

Обе строки совпадают, и на самом деле некоторые строки содержат обе строки.

Точное совпадение строк

-x(Линия регулярные выражения) будут соответствовать только строкам , где вся линия матчей условия поиска. Давайте найдем метку даты и времени, которая, как мы знаем, появляется в файле журнала только один раз:

grep -x "20 января - 06 15:24:35" geek-1.log

Найдена и отображена единственная совпадающая строка.

Противоположна только показывает строки , которые не соответствуют. Это может быть полезно, когда вы просматриваете файлы конфигурации. Комментарии - это здорово, но иногда среди них сложно выделить настоящие настройки. Вот /etc/sudoersфайл:

Мы можем эффективно отфильтровать строки комментариев следующим образом:

sudo grep -v "#" / etc / sudoers

Это намного проще разобрать.

Отображается только соответствующий текст

Может быть случай, когда вы не хотите видеть всю совпадающую строку, а только соответствующий текст. Вариант -o(единственное совпадение) делает именно это.

grep -o MemFree geek-1.log

Отображение уменьшено до отображения только текста, соответствующего поисковому запросу, вместо всей соответствующей строки.

Подсчет с помощью grep

grepЭто не только текст, но и числовая информация. Мы можем grepрассчитывать за нас по-разному. Если мы хотим знать, сколько раз поисковый запрос встречается в файле, мы можем использовать -cопцию (счетчик).

grep -c средний geek-1.log

grep сообщает, что поисковый запрос встречается в этом файле 240 раз.

Вы можете grepотобразить номер строки для каждой совпадающей строки, используя параметр -n(номер строки).

grep -n Ян компьютерщик-1.log

Номер строки для каждой совпадающей строки отображается в начале строки.

Чтобы уменьшить количество отображаемых результатов, используйте параметр -m(максимальное количество). Мы собираемся ограничить вывод пятью совпадающими строками:

grep -m5 -n Jan geek-1.log

Добавление контекста

Часто бывает полезно видеть некоторые дополнительные строки - возможно, несовпадающие - для каждой совпадающей строки. это может помочь определить, какие из совпадающих строк вам интересны.

Чтобы отобразить несколько строк после совпадающей строки, используйте параметр -A (после контекста). В этом примере мы просим использовать три строки:

grep -A 3 -x "20-янв-06 15:24:35" geek-1.log

Чтобы увидеть некоторые строки перед совпадающей строкой, используйте параметр -B(контекст перед).

grep -B 3 -x "20-янв-06 15:24:35" geek-1.log

А чтобы включить строки до и после совпадающей строки, используйте параметр -C(context).

grep -C 3 -x "20-янв-06 15:24:35" geek-1.log

Отображение совпадающих файлов

Чтобы увидеть имена файлов, содержащих поисковый запрос, используйте параметр -l (файлы с совпадением). Чтобы узнать, какие файлы исходного кода C содержат ссылки на sl.hфайл заголовка, используйте эту команду:

grep -l "sl.h" * .c

В списке указаны имена файлов, а не совпадающие строки.

И, конечно же, мы можем искать файлы, которые не содержат поискового запроса. Параметр -L(файлы без совпадений) делает именно это.

grep -L "sl.h" * .c

Начало и конец строк

Мы можем принудительно grepотображать только те совпадения, которые находятся либо в начале, либо в конце строки. Оператор регулярного выражения «^» соответствует началу строки. Практически все строки в файле журнала будут содержать пробелы, но мы будем искать строки, в которых пробел является первым символом:

grep "^" geek-1.log

Отображаются строки с пробелом в качестве первого символа - в начале строки.

Чтобы соответствовать концу строки, используйте оператор регулярного выражения «$». Мы будем искать строки, заканчивающиеся на «00».

grep "00 $" geek-1.log

На дисплее отображаются строки, в конце которых указано «00».

Использование каналов с grep

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

Допустим, мы хотим видеть все вхождения строки «ExtractParameters» в наших файлах исходного кода C. Мы знаем, что их будет довольно много, поэтому мы направляем вывод в less:

grep "ExtractParameters" * .c | Меньше

Результат представлен в формате less.

Это позволяет листать список файлов и использовать less'sсредство поиска.

Если мы перенаправим вывод из grepв wcи используем параметр -l(lines), мы сможем подсчитать количество строк в файлах исходного кода, которые содержат «ExtractParameters». (Мы могли бы добиться этого, используя grep-cопцию (count), но это отличный способ продемонстрировать выход из трубопровода grep.)

grep "ExtractParameters" * .c | wc -l

С помощью следующей команды мы передаем вывод из lsв grepи передаем вывод из grepв sort. Мы перечисляем файлы в текущем каталоге, выбираем те, в которых есть строка «Aug», и сортируем их по размеру файла:

ls -l | grep "Авг" | sort + 4n

Давайте разберемся с этим:

  • ls -l : выполнить длинный список форматов файлов с использованием ls.
  • grep «Aug» : выберите строки из lsсписка, в которых есть «Aug». Обратите внимание, что при этом также будут найдены файлы, в именах которых есть «Aug».
  • sort + 4n : отсортировать вывод grep по четвертому столбцу (размер файла).

Мы получаем отсортированный список всех файлов, измененных в августе (независимо от года), в порядке возрастания размера файла.

СВЯЗАННЫЕ: Как использовать каналы в Linux

grep: меньше команды, больше союзника

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

Сочетание grepс некоторыми регулярными выражениями-фу действительно выводит его на новый уровень.

СВЯЗАННЫЕ: Как использовать основные регулярные выражения для лучшего поиска и экономии времени