Alguém pode me dizer as diferenças técnicas entre grep
, egrep
, e fgrep
e fornecem exemplos adequados?
Quando preciso usar grep
o egrep
contrário e vice-versa?
grep
regular-expression
mr_eclair
fonte
fonte
Respostas:
egrep
é 100% equivalente agrep -E
fgrep
é 100% equivalente agrep -F
Historicamente, essas opções eram fornecidas em binários separados. Em alguns sistemas Unix realmente antigos, você encontrará 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
alterna grep para um modo especial para que a expressão seja avaliada como uma ERE (Extended Regular Expression), em oposição à sua correspondência normal de padrões. Detalhes dessa sintaxe estão na página de manual.A
-F
opção alterna grep para um modo diferente, onde aceita um padrão para corresponder, mas depois divide esse padrão em uma sequência de pesquisa por linha e faz uma pesquisa OR em qualquer uma das strings sem fazer nenhuma correspondência especial de padrões.Aqui estão alguns exemplos de cenários:
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:
A razão pela qual a
-F
opção ajuda aqui é que os nomes de usuário no seu arquivo de padrão são interpretados como cadeias 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|
usados como um operador OR. Você pode executar esta pesquisa usando-E
:... para retornar linhas que começam com "nofork" ou "nogroup". Sem a
-E
opção, você teria que escapar dos caracteres especiais envolvidos, porque, com a correspondência normal de padrões, eles apenas procurariam esse padrão exato;fonte
egrep
oufgrep
;-E
e-F
são padrão. Na verdade, existem pequenas incompatibilidadesegrep
: trata de maneira{
um pouco diferente.fgrep
usa o back-end Aho-Corasick, enquantogrep
usa uma versão modificada do Commentz-Walter. Isso significa quegrep
tem uma pior complexidade O (mn), enquanto que,fgrep
na pior das hipóteses, O (m + n).egrep
egrep -E
eram executados por diferentes executáveis, BusyBox e BSD grep. As duas variantes apresentaram diferenças comportamentais para construções não regix Posix, como\s
. Isso levou a muita confusão ...De
man grep
:Você usa
fgrep
ougrep -F
se não deseja que a sequência grepped seja interpretada como um padrão.Você usa
egrep
ougrep -E
se precisa usar uma regexp estendida.fonte
egrep
efgrep
são basicamente equivalente agrep -E
egrep -F
(respectivamente):As mensagens de erro podem ser diferentes.
fonte
De "man grep":
fonte
Se você procurar uma string literal e quiser ter certeza de que a string que você passou é interpretada literalmente (ou seja, sem correr o risco de dizer que um ponto ou ponto de interrogação será interpretado como outra coisa), use fgrep ou egrep -F.
Quanto à diferença entre egrep e grep, acho que o 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 exigem barras, enquanto outras não. Eu acho que o egrep é mais "compatível" com o perl regexps e o javascript regexps, então é mais fácil para mim usar o egrep.
Btw. Eu realmente encorajo você a experimentar o ack - ele suporta PREGs e possui padrões mais úteis (por exemplo, colorir, pular diretórios provavelmente não o que você deseja, como .svn, capacidade de seguir links simbólicos e é um pouco mais fácil digitar ack do que grep -E).
fonte