В чем разница между grep, pgrep, egrep, fgrep?

55

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

Эрик Лещинский
источник
1
На этот вопрос уже есть хороший ответ на этом сайте. unix.stackexchange.com/questions/17949/…
Ali786
И есть также скрипт bash sgrep :-).
Певик

Ответы:

85

Различия между 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 - это сокращение, которое расшифровывается как «Extended Global Regular Expressions Print».

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

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

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

grep "+" myfile.txt

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

egrep "+" myfile.txt

Здесь каждая строка возвращается, потому что +egrep был обработан как метасимвол. обычный 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.

Эрик Лещинский
источник
Из pgrepруководства : имя процесса, используемого для сопоставления, ограничено 15 символами, присутствующими в выходных данных / proc / pid / stat . Используйте параметр -f для сопоставления с полной командной строкой / proc / pid / cmdline .
Пабло А