Quando usar grep, less, awk, sed [closed]

16

Estou entrando no mundo do Linux e no trabalho estou usando grep mais e mais. Ao fazer isso, estou descobrindo que às vezes não é adequado para o que eu quero.

Eu estava lutando com grep alguns dias atrás e um colega meu que é administrador sênior do Linux me disse para usar awk . Fiquei impressionado com a rapidez com que obtive um resultado.

Então, minha pergunta é quando você escolhe usar uma sobre a outra? Que perguntas posso fazer a mim mesmo antes de ir trabalhar com grep e gastar muito tempo, quando eu poderia ter feito isso com awk e economizado tempo?

    
por frankguthrie 12.08.2016 / 17:05

1 resposta

24

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"])' com awk , sem equivalente direto com sed ).
  • (não padrão) grep -r para pesquisa recursiva
  • (não padrão) grep -P / pcregrep para expressões regulares semelhantes a perl (algumas sed 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 de awk ou sed 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 com sed ou awk )

sed

  • O comando s/foo/bar/ : sed s possui recursos que são difíceis de implementar em awk , como:
  • s/foo\(.*\)bar//g : capturando (embora o GNU awk tenha uma extensão gensub() 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 ...

    
por 12.08.2016 / 17:33

Tags