sed
e awk
são superconjuntos grep
, existem coisas que são mais fáceis de fazer com um ou outro.
grep foo
pode ser escrito sed '/foo/!d'
ou awk /foo/
, mas considere:
grep -i foo
teria que ser, a sed '/[fF][oO][oO]/!d'
menos que você queira considerar extensões não-padrão como as GNU sed '/foo/I!d'
. Ou com awk
: 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 com awk
ou sed
:
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"])'
com awk
, sem equivalente direto com sed
).
- (não padrão)
grep -r
para pesquisa recursiva
- (não padrão)
grep -P
/ pcregrep
para regexps do tipo perl (algumas sed
implementações têm suporte para regexp do tipo perl, embora não sejam as principais)
- (não padrão)
grep -o
para retornar a parte correspondente (várias linhas awk
ou sed
fazer o mesmo)
- (não padrão)
grep -A/B/C
para retornar o contexto durante a partida (novamente doloroso de fazer da mesma maneira com sed
ou awk
)
sed
s/foo/bar/
sed
O s
comando :: possui recursos difíceis de implementar, awk
como:
s/foo\(.*\)bar/\1/g
: captura (embora o GNU awk tenha uma gensub()
extensão para isso)
s/foo/bar/3
: substitua a 3ª ocorrência em cada linha
- (não padrão): edição de arquivos no local (embora agora também seja suportado pelo GNU
awk
).
awk
awk
é o mais rico em recursos dos três.
- bom para lidar com números
- bom para lidar com entrada formatada em colunas.
- bom para extrair e combinar dados de diferentes fontes, com suas matrizes associativas.
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 aqueles sed
/ 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 os sed
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
ou sed
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 ...