Estou entrando no mundo do Linux e no trabalho estou usando grep
cada vez mais. Ao fazer isso, estou descobrindo que às vezes não é adequado para o que quero.
Eu estava lutando com grep
alguns dias atrás e um colega meu, que é um administrador sênior do Linux, me disse para usar awk
. Fiquei surpreso com a rapidez com que obtive um resultado.
Então, minha pergunta é quando você escolhe usar um sobre o outro? Que perguntas posso me fazer antes de trabalhar grep
e gastar muito tempo, quando eu poderia ter feito isso awk
e economizado tempo?
less
para visualizar um arquivo. Usegrep
para pesquisar um arquivo. Usesed
para editar um arquivo. Useawk
sobregrep
esed
quando o arquivo que você deseja processar tiver algum tipo de estrutura (como colunas). Usesed
sobreawk
quando você quer principalmente para lidar com linhas (tais como linhas de apagar ou adicionar de texto). Tenho certeza de que alguém escreverá uma resposta de 20 páginas mais completa que a minha.Respostas:
sed
eawk
são superconjuntosgrep
, existem coisas que são mais fáceis de fazer com um ou outro.grep foo
pode ser escritosed '/foo/!d'
ouawk /foo/
, mas considere:grep -i foo
teria que ser, ased '/[fF][oO][oO]/!d'
menos que você queira considerar extensões não-padrão como as GNUsed '/foo/I!d'
. Ou comawk
:awk 'tolower($0) ~ /foo/'
ou novamente usando uma extensão GNU:awk -v IGNORECASE=1 /foo/
.Coisas nas quais as diferentes ferramentas são boas e complicadas com as outras ferramentas:
grep
grep
é uma ferramenta simples, mas possui modos de operação muito especializados, mais difíceis de reproduzir comawk
oused
:grep -i
para correspondência sem distinção entre maiúsculas e minúsculas (veja acima)grep -Fe "$string"
para pesquisa de cadeia fixa (export string; awk 'index($0, ENVIRON["string"])'
comawk
, sem equivalente direto comsed
).grep -r
para pesquisa recursivagrep -P
/pcregrep
para regexps do tipo perl (algumassed
implementações têm suporte para regexp do tipo perl, embora não sejam as principais)grep -o
para retornar a parte correspondente (várias linhasawk
oused
fazer o mesmo)grep -A/B/C
para retornar o contexto durante a partida (novamente doloroso de fazer da mesma maneira comsed
ouawk
)sed
s/foo/bar/
sed
Os
comando :: possui recursos difíceis de implementar,awk
como:s/foo\(.*\)bar/\1/g
: captura (embora o GNU awk tenha umagensub()
extensão para isso)s/foo/bar/3
: substitua a 3ª ocorrência em cada linhaawk
).awk
awk
é o mais rico em recursos dos três.perl
perl
como uma ferramenta prática de extração e relatório, tem o melhor de todos. Foi para isso que ele foi projetado inicialmente (para ser a ferramenta que torna todos aquelessed
/awk
obsoletos).O domínio
perl
do processamento de texto oferece uma vantagem séria. Eu recomendo dedicar algum tempo, mesmo antes de olhar para ossed
comandos menos comuns, por exemplo.desempenho
Como regra geral, quanto mais especializada for a ferramenta, mais eficiente ela estará na tarefa. Mas isso também depende muito da implementação, a tarefa e alguns outros fatores e desempenho podem ter trocas que podem precisar ser levadas em consideração.
Por exemplo, há alguns
grep
oused
implementações que são muito rápido, mas, por exemplo, eles não suportam caracteres de vários bytes por isso só pode funcionar corretamente em texto US-Inglês em locais de vários bytes. Ou são rápidos porque trabalham em um pequeno buffer de tamanho fixo e, portanto, não podem funcionar com entradas arbitrárias ...fonte
awk
é muito mais rápida quegrep
.mawk
é conhecido por ser muito eficiente (mas não suporta caracteres de vários bytes que é parte da razão pela qual é mais eficiente do que algumas outras ferramentas)