Pesquisa de site

Qual é a diferença entre Grep, Egrep e Fgrep no Linux?


Uma das renomadas ferramentas de pesquisa em sistemas do tipo Unix que pode ser usada para pesquisar qualquer coisa, seja um arquivo, uma linha ou várias linhas em um arquivo, é o utilitário grep. É muito vasto em funcionalidade, o que pode ser atribuído ao grande número de opções que suporta, como: pesquisa usando padrão de string, ou padrão reg-ex ou reg-ex baseado em perl, etc.

Devido às suas diversas funcionalidades, possui muitas variantes, incluindo grep, egrep (GREP estendido), fgrep (GREP >GREP corrigido), pgrep (GREP de processo), rgrep (GREP recursivo) etc. Mas essas variantes têm pequenas diferenças em relação ao grep original, o que as tornou populares e podem ser usadas por vários programadores Linux para tarefas específicas.

A principal coisa que resta a ser investigada é quais são as diferenças entre as três variantes principais, ou seja, 'grep', 'egrep' e 'fgrep' do grep que faz com que os usuários do Linux escolham uma ou outra versão conforme a necessidade.

Alguns metacaracteres especiais do grep

  1. + – Equivalente a uma ou mais ocorrências do caracter anterior.
  2. ? – Isso denota quase 1 repetição do caractere anterior. Como: a? Corresponderia a ‘a’ ou ‘aa’.
  3. ( – Início da expressão de alternância.
  4. ) – Expressão de fim de alternância.
  5. | – Corresponde a qualquer uma das expressões separadas por '|'. Como: “(a|b)cde ” corresponderia a 'abcde' ou 'bbcde'.
  6. { – Este metacaractere indica o especificador de início do intervalo. Como: “a{2} ” corresponde a “aa ” no arquivo, ou seja, 2 vezes.
  7. } – Este metacaractere indica o especificador de fim de intervalo.

Diferenças entre grep, egrep e fgrep

Algumas diferenças principais entre grep, egrep e fgrep podem ser destacadas a seguir. Para este conjunto de exemplos, estamos assumindo que o arquivo no qual a operação está sendo executada é:

Comando Grep

grep ou Global Regular Expression Print é o principal programa de pesquisa em sistemas do tipo Unix que pode pesquisar qualquer tipo de string em qualquer arquivo ou lista de arquivos ou até mesmo a saída de qualquer comando.

Leitura sugerida: 12 exemplos práticos do comando grep do Linux

Ele usa Expressões Regulares Básicas além de strings normais como padrão de pesquisa. Em expressões regulares básicas (BRE), metacaracteres como: '{','}','(',')','|','+','?' perdem seu significado e são tratados como caracteres normais de string e precisam ser escapados se forem tratados como caracteres especiais .

Leitura sugerida: 11 comandos avançados ‘Grep’ em classes de caracteres e expressões de colchetes

Além disso, grep usa o algoritmo Boyer-Moore para pesquisar rapidamente qualquer string ou expressão regular.

grep -C 0 '(f|g)ile' check_file
grep -C 0 '\(f\|g\)ile' check_file

Como aqui, quando o comando é executado sem escapar de '(' ')' e '|' então ele procurou pela string completa, ou seja, “(f|g )ile ” no arquivo. Mas quando os caracteres especiais foram escapados, em vez de tratá-los como parte de uma string, o grep os tratou como metacaracteres e pesquisou as palavras “file ” ou “gile ” no arquivo.

Comando Egrep

Egrep ou grep -E é outra versão do grep ou grep estendido. Esta versão do grep é eficiente e rápida quando se trata de procurar um padrão de expressão regular, pois trata os metacaracteres como estão e não os substitui como strings como no grep e, portanto, você está livre do fardo de escapar deles como em grep. Ele usa ERE ou o conjunto de expressões regulares estendidas.

No caso de egrep, mesmo que você não escape dos metacaracteres, ele os trataria como caracteres especiais e os substituiria por seu significado especial, em vez de tratá-los como parte de uma string.

egrep -C 0 '(f|g)ile' check_file
egrep -C 0 '\(f\|g\)ile' check_file

Como aqui, egrep procurou pela string “file ” quando os metacaracteres não foram escapados, como significaria pelo significado desses caracteres. Mas, quando esses caracteres foram escapados, o egrep os tratou como parte da string e procurou pela string completa “(f|g)ile ” no arquivo.

Comando fgrep

Fgrep ou grep fixo ou grep -F é outra versão do grep que é rápida na pesquisa quando se trata de pesquisar a string inteira em vez de expressões regulares, pois não reconhece as expressões regulares, nem quaisquer metacaracteres. Para pesquisar qualquer string direta, esta é a versão do grep que deve ser selecionada.

Fgrep procura uma string completa e nem mesmo reconhece caracteres especiais como parte de uma expressão regular, mesmo que tenham escapado ou não.

fgrep -C 0 '(f|g)ile' check_file
fgrep -C 0 '\(f\|g\)ile' check_file

Por exemplo, quando os metacaracteres não foram escapados, fgrep procurou pela string completa “(f|g)ile ” no arquivo, e quando os metacaracteres foram escapados, o comando fgrep procurou por “\(f\|g\)ile ” todos os caracteres como estão no arquivo.

Já cobrimos alguns exemplos práticos do comando grep, você pode lê-los aqui, se quiser aproveitar melhor o comando grep no Linux.

Aprenda 12 exemplos práticos de comando grep do Linux

Conclusão

Acima estão destacadas as diferenças entre ‘grep’, ‘egrep’ e ‘fgrep’. Além da diferença no conjunto de expressões regulares usadas e na velocidade de execução, os demais parâmetros da linha de comando permanecem os mesmos para todas as três versões do grep e até mesmo em vez de “egrep” ou “fgrep”, “grep -E” ou “grep - F ” são recomendados para serem usados.

Se você encontrar outras diferenças entre essas três versões do grep, mencione-as em seus comentários.