Qual é a diferença entre grep, pgrep, egrep, fgrep?

Respostas:

85

Diferenças entre grep, pgrep, egrep e fgrep (Linux):

grep

grep é um acrônimo que significa "Global Regular Expressions Print". grep é um programa que verifica um ou mais arquivos especificados linha por linha, retornando linhas que contêm um padrão. Um padrão é uma expressão que especifica um conjunto de cadeias interpretando caracteres como meta caracteres. Por exemplo, o meta caractere asterisco (*) é interpretado como significando "zero ou mais do elemento anterior". Isso permite que os usuários digitem uma série curta de caracteres e meta caracteres em um comando grep para que o computador nos mostre quais linhas em quais arquivos correspondem.

O comando grep padrão se parece com:

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

grep imprime os resultados da pesquisa na tela (stdout) e retorna os seguintes valores de saída:

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).

Alguns sinalizadores comuns são: -cpara contar o número de correspondências bem-sucedidas e não imprimir as correspondências reais, -itornar a pesquisa insensitiva, -nimprimir o número da linha antes de cada impressão da correspondência, -vobter o complemento da expressão regular (ou seja, retornar as linhas que não correspondem) e -lpara imprimir os nomes dos arquivos com linhas que correspondam à expressão.

egrep

egrep é um acrônimo que significa "Impressão de expressões regulares globais estendidas".

O 'E' no egrep significa tratar o padrão como uma expressão regular. "Expressões regulares estendidas" abreviadas 'ERE' são ativadas no egrep. egrep (que é a mesma que grep -E) trata +, ?, |, (, e )como meta-caracteres.

Em expressões regulares básicas (com grep), a meta-caracteres ?, +, {, |, (, e )perdem seu significado especial. Se você quiser grep para tratar estes caracteres como meta-caracteres, escapar-lhes \?, \+, \{, \|, \(, e \).

Por exemplo, aqui o grep usa expressões regulares básicas onde o sinal de mais é tratado literalmente, qualquer linha com um sinal de mais é retornada.

grep "+" myfile.txt

egrep, por outro lado, trata o "+" como um meta caractere e retorna todas as linhas porque plus é interpretado como "uma ou mais vezes".

egrep "+" myfile.txt

Aqui cada linha é retornada porque +foi tratada pelo egrep como um meta caractere. o grep normal teria pesquisado apenas linhas com um literal +.

fgrep

fgrep é um acrônimo que significa "Impressão de expressões regulares globais de seqüência fixa".

O fgrep (que é o mesmo que grep -F) é um grep fixo ou rápido e se comporta como grep, mas NÃO reconhece nenhum meta-caractere de expressão regular como especial. A pesquisa será concluída mais rapidamente porque processa apenas uma sequência simples e não um padrão complexo.

Por exemplo, se eu quisesse pesquisar um ponto literal (.) No meu .bash_profile, seria difícil usar grep porque teria que escapar do ponto porque dot é um meta caractere que significa 'curinga, qualquer caractere único':

grep "." myfile.txt

O comando acima retorna todas as linhas do myfile.txt. Faça isso:

fgrep "." myfile.txt

Depois, apenas as linhas que possuem um literal '.' neles são retornados. O fgrep nos ajuda a não nos incomodar em escapar de nossos meta caracteres.

pgrep

pgrep é um acrônimo que significa "Impressão de expressões regulares globais de identificação de processo".

O pgrep examina os processos atualmente em execução e lista os IDs do processo que correspondem aos critérios de seleção para o stdout. O pgrep é útil quando tudo o que você deseja saber é o número inteiro da identificação do processo. Por exemplo, se eu quisesse conhecer apenas o ID do processo mysql, usaria o comando pgrep mysqlque retornaria um ID do processo como 7312.

Eric Leschinski
fonte
Do pgrepmanual : o nome do processo usado para correspondência é limitado aos 15 caracteres presentes na saída de / proc / pid / stat . Use a opção -f para corresponder à linha de comando completa, / proc / pid / cmdline .
Pablo A