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

Quando devo usar grep em egrep e vice-versa?

Comentários

Resposta

Historicamente, essas opções eram fornecidas 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 as opções são preferidas. A página de manual do grep tem detalhes sobre isso.

Quanto ao que eles fazem, -E muda o grep para um modo especial para que a expressão seja avaliada como uma ERE (Expressão Regular Estendida) ao invés de seu normal correspondência de padrões. Os detalhes desta sintaxe estão na página de manual.

-E, --extended-regexp
Interprete PATTERN como um regular estendido expressão

A opção -F muda o grep para um modo diferente, onde aceita um padrão para corresponder, mas então divide esse padrão em uma string de pesquisa por linha e faz uma pesquisa OR em qualquer uma das strings sem fazer nenhuma correspondência de padrão especial.

-F, --fixed-strings
Interprete PADRÃO como uma lista de strings fixas, separadas por novas linhas, qualquer uma das quais deve ser correspondida.

Aqui estão alguns cenários de exemplo:

  • Você tem um arquivo com uma lista de, digamos, dez nomes de usuário 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 algum grupo especial:

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

    O motivo de -F opção ajuda aqui é que os nomes de usuário em seu arquivo de padrão são interpretados como strings de texto simples. Pontos, por exemplo, seriam interpretados como pontos em vez de curingas.

  • Você deseja pesquisar usando uma expressão extravagante. Por exemplo, parênteses () podem ser usados para indicar grupos com | usado como um operador OR. Você pode executar esta 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 os caracteres especiais envolvidos porque com a correspondência de padrão normal, eles apenas procurariam esse padrão exato;

    grep "^no\(fork\|group\)" /etc/group 

Comentários

  • Alguns sistemas não ' têm egrep ou fgrep; -E e -F são padrão. Na verdade, existem pequenas incompatibilidades em egrep: trata { de maneira ligeiramente diferente.
  • fgrep usa o backend Aho-Corasick, enquanto grep usa uma versão modificada do Commentz-Walter. Isso significa que grep tem o pior caso de complexidade O (mn), enquanto fgrep está no pior caso O (m + n).
  • Gilles au contraire mon capitan , alguns sistemas (mais antigos talvez) podem não ter a opção -F para grep padrão, mas tem um fgrep, alguns ppl reclamam sobre isso no tópico original que descobri sobre o uso de grep para caracteres especiais
  • Recentemente, encontrei um sistema Android no qual egrep e grep -E eram controlados por diferentes executáveis, BusyBox e BSD grep. As duas variantes tinham diferenças comportamentais para construções regex não Posix, como \s. Isso gerou muita confusão …

Resposta

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 deseja que a string grepped seja interpretada como um padrão.

Use egrep ou grep -E se você precisar usar uma expressão regular estendida.

Resposta

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.

Comentários

  • ok, mas o que é uma expressão regular estendida? Ele realmente não ' explica abaixo. Alguns exemplos seriam bons …
  • @isomorphismes: Este link dos wikibooks explica muito bem …

Resposta

De “man grep”:

três programas variantes egrep, fgrep e rgrep estão disponíveis. egrep é o mesmo que grep -E. fgrep é o mesmo que grep -F. rgrep é o mesmo que grep -r. A invocação direta como egrep ou fgrep está obsoleta, mas é fornecida para permitir que aplicativos históricos que dependem deles sejam executados sem modificações.

Comentários

  • A pergunta pede um exemplo adequado.

Resposta

Se você procura por uma string literalmente e quer 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 outra coisa), use fgrep ou egrep -F.

Quanto à diferença entre egrep e grep, acho que egrep é na maioria das vezes o que você deseja. O site do manual GNU lista as diferenças entre grep e egrep que parecem estar na sintaxe: algumas coisas requerem barras, enquanto outras não. Eu acho que egrep é mais “compatível” com regexps perl e javascript regexps, então é mais fácil para mim usar egrep.

Btw. Eu realmente encorajo você a dar uma chance ao ack – ele suporta PREGs e tem padrões mais úteis (ou seja, colorir, pular diretórios que provavelmente não são o que você quer como .svn, capacidade de seguir links simbólicos e é “um pouco mais fácil digitar ack do que grep -E).

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *