Qual é a diferença entre 'grep', 'egrep' e 'fgrep'?

244

Alguém pode me dizer as diferenças técnicas entre grep , egrep e fgrep e fornecer exemplos adequados?

Quando preciso usar grep over egrep e vice-versa?

    
por mr_eclair 03.08.2011 / 11:05

5 respostas

262

Historicamente, esses switches foram fornecidos em binários separados. Em alguns sistemas Unix realmente antigos, você descobrirá que precisa chamar os binários separados, mas em todos os sistemas modernos os switches são os preferidos. A man page do grep tem detalhes sobre isso.

Quanto ao que eles fazem, -E alterna grep para um modo especial para que a expressão seja avaliada como ERE (Extended Regular Expression) em oposição à correspondência de padrão normal. Detalhes dessa sintaxe estão na página man.

-E, --extended-regexp
Interpret PATTERN as an extended regular expression

A opção -F alterna grep para um modo diferente no qual aceita um padrão para corresponder, mas divide esse padrão em uma cadeia de pesquisa por linha e faz uma pesquisa OR em qualquer uma das sequências sem fazer nenhuma correspondência especial de padrão .

-F, --fixed-strings
Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.

Aqui estão alguns cenários de exemplo:

  • Você tem um arquivo com uma lista de, digamos, dez nomes de usuários Unix em texto simples. Você deseja pesquisar o arquivo de grupo em sua máquina para ver se algum dos dez usuários listados está em grupos especiais:

    grep -F -f user_list.txt /etc/group
    

    A razão pela qual a opção -F ajuda aqui é que os nomes de usuários no arquivo padrão são interpretados como strings de texto simples. Pontos, por exemplo, seriam interpretados como pontos e não como curingas.

  • Você deseja pesquisar usando uma expressão sofisticada. Por exemplo, parênteses () podem ser usados para indicar grupos com | usado como um operador OR. Você poderia executar essa pesquisa usando -E :

    grep -E '^no(fork|group)' /etc/group
    

    ... para retornar linhas que começam com "nofork" ou "nogroup". Sem a opção -E , você teria que escapar dos caracteres especiais envolvidos, pois, com a correspondência normal de padrões, eles procurariam apenas o padrão exato;

    grep '^no\(fork\|group\)' /etc/group
    
por 03.08.2011 / 11:09
28

De man grep :

 egrep is the same as grep -E.
 fgrep is the same as grep -F.  Direct invocation as either egrep  or  
  fgrep  is  deprecated,  but  is provided to allow historical applications
  that rely on them to run unmodified.

Você usa fgrep ou grep -F se você não quiser que a string grepped seja interpretada como um padrão.

Você usa egrep ou grep -E se precisar usar um regexp estendido.

    
por 03.08.2011 / 11:11
12

egrep e fgrep são basicamente equivalentes a grep -E e grep -F (respectivamente):

   -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).  (-E is specified by POSIX.)

   -F, --fixed-strings
          Interpret  PATTERN  as  a  list  of  fixed strings, separated by
          newlines, any of which is to be matched.  (-F  is  specified  by
          POSIX.)

As mensagens de erro podem ser diferentes.

    
por 03.08.2011 / 11:10
8

De "man grep":

three variant programs egrep, fgrep and rgrep are available. egrep is the same as grep -E. fgrep is the same as grep -F. rgrep is the same as grep -r. Direct invocation as either egrep or fgrep is deprecated, but is provided to allow historical applications that rely on them to run unmodified.

    
por 03.08.2011 / 11:08
3

Se você procurar por uma string textual, e quiser ter certeza de que a string que você passou é interpretada literalmente (ou seja, sem arriscar que um ponto ou ponto de interrogação seja interpretado como algo diferente) use fgrep ou egrep -F. / p>

Quanto à diferença entre egrep e grep, acho que egrep é a maior parte do tempo o que você quer. O site de manual do GNU lista as diferenças entre grep e egrep que parecem coloque na sintaxe: algumas coisas requerem barras enquanto outras não. Eu acho que egrep é mais "compatível" com regexps perl e regexps javascript, então é mais fácil para mim usar o egrep.

Entre. Eu realmente encorajo você a dar ack uma tentativa - ele suporta PREGs, e tem mais padrões úteis (por exemplo, coloração, ignorando provavelmente-não-o-que-você -want diretórios como .svn, capacidade de seguir links simbólicos, e é um pouco mais fácil digitar ack do que grep -E).

    
por 29.01.2015 / 13:31