Usando o grep vs awk

15

Para capturar um padrão específico, awk e grep podem ser usados. Por que devemos usar um sobre o outro? Qual é mais rápido e por quê?

Se eu tivesse um arquivo de log e eu quisesse pegar um certo padrão, poderia fazer um dos seguintes

awk '/pattern/' /var/log/messages

ou

grep 'pattern' /var/log/messages

Eu não fiz nenhum benchmarking, então eu não saberia. Alguém pode elaborar isso? É ótimo conhecer o funcionamento interno dessas duas ferramentas.

    
por holasz 28.08.2013 / 10:20

5 respostas

25

provavelmente será mais rápido:

# time awk '/USAGE/' imapd.log.1 | wc -l
73832

real    0m2.756s
user    0m2.740s
sys     0m0.020s

# time grep 'USAGE' imapd.log.1 | wc -l
73832

real    0m0.110s
user    0m0.100s
sys     0m0.030s

awk é uma linguagem de programação interpretada, onde grep é um programa compilado de código-c (que é adicionalmente otimizado para encontrar padrões em arquivos).

(Nota - eu corri os dois comandos duas vezes para que o cache não pudesse distorcer os resultados)

Mais detalhes sobre idiomas interpretados na wikipedia.

Como Stephane apontou corretamente nos comentários, sua milhagem pode variar devido à implementação do grep e do awk que você usa, do sistema operacional em que está e do conjunto de caracteres que está processando.

    
por 28.08.2013 / 10:44
12

Use a ferramenta mais específica e expressiva. A ferramenta que melhor se adapta ao seu caso de uso é provavelmente a mais rápida.

Como um guia aproximado:

  • procurando por linhas correspondentes a uma substring ou regexp? Use grep.
  • selecionando certas colunas de um arquivo delimitado de forma simples? Use o corte.
  • executando substituições baseadas em padrões ou ... outras coisas que o sed pode fazer razoavelmente? Use sed.
  • precisa de alguma combinação dos 3 acima, ou formatação printf, ou loops e ramificações de propósito geral? Use o awk.
por 28.08.2013 / 14:31
9

Quando pesquisar somente por strings e velocidade, você deve quase sempre usar grep . São ordens de grandeza mais rápidas que awk quando se trata apenas de busca bruta.

fonte O Diferenças funcionais e de desempenho do sed, awk e outros utilitários de análise do Unix

UTILITY    OPERATION TYPE      EXECUTION TIME     CHARACTERS PROCESSED PER SECOND
                               (10 ITERATIONS)
-------    --------------      ---------------    -------------------------------
grep       search only         41 sec.            489.3 million
sed        search & replace    4 min. 4 sec.      82.1 million
awk        search & replace    4 min. 46 sec.     69.8 million
Python     search & replace    4 min. 50 sec.     69.0 million
PHP        search & replace    15 min. 44 sec.    21.2 million
    
por 28.08.2013 / 11:12
5

Embora eu concorde que, em teoria, grep deva ser mais rápido que awk , na prática, o YMMV depende muito da implementação que você usa.

aqui comparando grep e awk do busybox 1.20.0, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 no Debian / Linux 7.0 amd64 (com glibc 2.17) em um locale UTF-8 em um arquivo de 240MB de 2.5 M linhas de caracteres somente ASCII.

$ time busybox grep error error | wc -l
331003
busybox grep error error  8.31s user 0.12s system 99% cpu 8.450 total
wc -l  0.07s user 0.11s system 2% cpu 8.448 total
$ time  busybox awk /error/ error | wc -l
331003
busybox awk /error/ error  2.39s user 0.84s system 98% cpu 3.265 total
wc -l  0.12s user 1.23s system 41% cpu 3.264 total
$ time  grep error error | wc -l
331003
grep error error  0.80s user 0.10s system 99% cpu 0.914 total
wc -l  0.00s user 0.11s system 12% cpu 0.913 total
$ time mawk /error/ error | wc -l
330803
mawk /error/ error  0.54s user 0.13s system 91% cpu 0.732 total
wc -l  0.03s user 0.08s system 14% cpu 0.731 total
$ time gawk /error/ error | wc -l
331003
gawk /error/ error  1.37s user 0.12s system 99% cpu 1.494 total
wc -l  0.04s user 0.07s system 7% cpu 1.492 total
$ time 

Na localidade C, apenas o GNU grep recebe um aumento significativo e se torna mais rápido que mawk .

O conjunto de dados, o tipo do regexp também pode fazer uma grande diferença. Para regexps, awk deve ser comparado a grep -E , pois as expressões regulares deawk são REs estendidos.

Para este conjunto de dados, awk pode ser mais rápido que grep em sistemas ou sistemas baseados em busybox onde mawk é o padrão awk e o local padrão é UTF-8 (IIRC, costumava ser o caso no Ubuntu).

    
por 28.08.2013 / 14:19
2

Em suma, grep faz apenas uma coisa, como muitas outras ferramentas do UNIX, e combina uma linha com o padrão fornecido e faz isso bem. Por outro lado, awk é uma ferramenta mais sofisticada, pois é uma linguagem de programação completa definida pelo padrão POSIX com características típicas como variáveis, matrizes, expressões, funções ou instruções de controle para varredura e processamento de padrões.

Na minha opinião, depende da implementação como as duas ferramentas executam no caso de correspondência de padrões e no tamanho de alguma entrada que você deseja processar. Eu esperaria que o grep seja geralmente mais eficiente que o awk, já que combina apenas. Mas você não pode escrever com o grep um código simples para executar tarefas mais complexas, como processamento adicional de registros combinados, computação ou resultados de impressão sem usar outras ferramentas.

    
por 28.08.2013 / 11:05