sed
e awk
são superconjuntos de grep
, há 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 sed '/[fF][oO][oO]/!d'
, a menos que você queira considerar extensões não padrão como sed '/foo/I!d'
do GNU. Ou com awk
: awk 'tolower($0) ~ /foo/'
ou novamente usando uma extensão GNU: awk -v IGNORECASE=1 /foo/
.
Coisas em que as diferentes ferramentas são boas e incômodas com as outras ferramentas:
grep
grep
é uma ferramenta simples, mas tem modos de operação muito especializados que são mais difíceis de reproduzir com awk
ou sed
:
-
grep -i
para correspondência insensível a maiúsculas e minúsculas (veja acima) -
grep -Fe "$string"
para pesquisa de sequência fixa (export string; awk 'index($0, ENVIRON["string"])'
comawk
, sem equivalente direto comsed
). - (não padrão)
grep -r
para pesquisa recursiva - (não padrão)
grep -P
/pcregrep
para expressões regulares semelhantes a perl (algumassed
implementações têm suporte a expressão regular perl, embora não sejam as mais importantes) - (não padrão)
grep -o
para retornar a parte correspondente (várias linhas deawk
oused
para fazer o mesmo) - (não padrão)
grep -A/B/C
para retornar o contexto em torno da correspondência (mais uma vez doloroso de se fazer de maneira semelhante comsed
ouawk
)
sed
-
O comando
s/foo/bar/
:sed
s
possui recursos que são difíceis de implementar emawk
, como: -
s/foo\(.*\)bar//g
: capturando (embora o GNU awk tenha uma extensãogensub()
para isso) -
s/foo/bar/3
: substitua a terceira ocorrência em cada linha - (não padrão): edição de arquivos no local (embora também seja suportada pelo GNU
awk
agora).
awk
awk
é o recurso mais rico dos três.
- bom para lidar com números
- bom para lidar com entradas formatadas 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órios tem o melhor de todos. Foi para isso que foi inicialmente projetado (para ser a ferramenta que torna todos aqueles sed
/ awk
obsoletos).
Masterizar perl
para processar texto dá uma grande vantagem. Eu recomendo gastar algum tempo nisso, mesmo antes de olhar para os comandos sed
menos comuns, por exemplo.
desempenho
Como regra geral, quanto mais especializada for a ferramenta, mais eficiente será a tarefa. Mas isso também depende muito da implementação, a tarefa e alguns outros fatores e desempenho podem ter trade-offs que talvez precisem ser levados em conta.
Por exemplo, há algumas implementações grep
ou sed
que são muito rápidas, mas, por exemplo, não suportam caracteres multibyte, portanto, só funcionam corretamente em texto em inglês dos EUA em localidades com vários bytes. Ou eles são rápidos porque funcionam em um pequeno buffer de tamanho fixo e, portanto, não podem funcionar em entradas arbitrárias ...