52

Я хотел бы познакомиться с различиями между grep , pgrep , egrep и fgrep и их использованием.

1 ответ1

82

Различия между grep, pgrep, egrep и fgrep (Linux):

Grep

grep это аббревиатура, которая расшифровывается как "Global Regular Expressions Print". grep - это программа, которая сканирует указанный файл или файлы построчно, возвращая строки, содержащие шаблон. Шаблон - это выражение, которое определяет набор строк путем интерпретации символов как метасимволов. Например, метасимвол звездочки (*) интерпретируется как означающий "ноль или более предшествующего элемента". Это позволяет пользователям вводить короткие последовательности символов и метасимволов в команду grep, чтобы компьютер показывал нам, какие строки в каких файлах совпадают.

Стандартная команда grep выглядит так:

grep <flags> '<regular expression>' <filename>

grep выводит результаты поиска на экран (stdout) и возвращает следующие выходные значения:

0    A match was found.
1    No match was found.
>1   A syntax error was found or a file was inaccessible 
     (even if matches were found).

Вот некоторые общие флаги: -c для подсчета количества успешных совпадений и отсутствия распечатки фактических совпадений, -i чтобы сделать регистр поиска нечувствительным, -n для вывода номера строки перед каждой распечаткой совпадения, -v для получения дополнения к регулярное выражение (т.е. возвращает строки, которые не совпадают), и -l для печати имен файлов файлов со строками, которые соответствуют выражению.

задать расширенное

egrep - это сокращение, которое расшифровывается как "Расширенная печать глобальных регулярных выражений".

Буква "E" в egrep означает, что шаблон рассматривается как регулярное выражение. "Расширенные регулярные выражения", сокращенно "ERE", включены в egrep. egrep (то же самое, что grep -E) лечит + ? , | , ( , и ) как метасимволы.

В основных регулярных выражениях (с grep) метасимволы ? , + , { , | , ( , и ) теряют свое особое значение. Если вы хотите, чтобы grep рассматривал эти символы как метасимволы, экранируйте их \? , \+ , \{ , \| , \( и \) .

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

grep "+" myfile.txt

egrep, с другой стороны, обрабатывает «+» как метасимвол и возвращает каждую строку, потому что плюс интерпретируется как "один или несколько раз".

egrep "+" myfile.txt

Здесь каждая строка возвращается , потому что + лечились как задать расширенную мету характера. обычный grep искал бы только строки с литералом + .

fgrep

fgrep - это аббревиатура, обозначающая «Печать глобальных регулярных выражений с фиксированной строкой».

fgrep (то же самое, что и grep -F) является фиксированным или быстрым grep и ведет себя как grep, но НЕ распознает мета-символы регулярных выражений как специальные. Поиск завершится быстрее, потому что он обрабатывает только простую строку, а не сложный шаблон.

Например, если бы я хотел найти в моем .bash_profile литеральную точку (.), Тогда было бы сложно использовать grep, потому что мне пришлось бы избегать точки, потому что точка - это метасимвол, который означает «подстановочный знак, любой отдельный символ»:

grep "." myfile.txt

Приведенная выше команда возвращает каждую строку myfile.txt. Сделайте это вместо этого:

fgrep "." myfile.txt

Тогда только строки, которые имеют буквальный «.» в них возвращаются. fgrep помогает нам не убегать от мета-символов.

pgrep

pgrep - это аббревиатура, обозначающая «Печать глобальных регулярных выражений Process-ID».

pgrep просматривает запущенные в данный момент процессы и перечисляет идентификаторы процессов, которые соответствуют критериям выбора для stdout. pgrep удобен, когда все, что вы хотите знать - это целое число процесса. Например, если бы я хотел знать только идентификатор процесса моего процесса mysql, я бы использовал команду pgrep mysql которая возвращала бы идентификатор процесса, например 7312.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .