Para capturar um padrão específico, awk
e grep
pode ser usado. Por que devemos usar um sobre o outro? Qual é mais rápido e por quê?
Se eu tivesse um arquivo de registro e quisesse pegar um determinado padrão, poderia fazer o seguinte
awk "/pattern/" /var/log/messages
ou
grep "pattern" /var/log/messages
Não fiz nenhum benchmarking, então não saberia. Alguém pode elaborar isso? É ótimo saber o funcionamento interno dessas duas ferramentas.
Comentários
Resposta
O grep provavelmente será seja 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 como grep é um programa de código c compilado (que é adicionalmente otimizado para encontrar padrões em arquivos) .
(Observação – executei os dois comandos duas vezes para que o cache não distorcesse os resultados)
Mais detalhes sobre linguagens interpretadas na wikipedia.
Como Stephane corretamente apontou 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 você estão processando.
Comentários
- Sem dizer qual implementação grep ou awk você ‘ está usando e assim por diante qual arquitetura de computador, e com qual conjunto de caracteres do sistema, esses tempos têm pouco valor.
- o segundo comando também usará o novo versão em cache. Não tenho dúvidas de que grep é mais rápido, mas não tanto quanto seus números mostram.
- (portanto, executando awk, grep, awk, grep e postando os resultados do segundo conjunto de awk e grep 🙂 e FYI , Eu moro em um local UTF8.
- Engraçado, com as ferramentas BSD (em um Mac), awk (31.74s) é ligeiramente mais rápido que sed (33.34s), que é um pouco mais rápido que grep ( 34,21s). Gnu awk possui todos eles em 5.24s, eu não ‘ não tenho gnu grep ou sed para testar.
- grep deve ser um pouco mais rápido porque awk faz mais com cada um linha de entrada do que apenas procurar por uma expressão regular nela, por exemplo se um campo for referenciado no script (o que ‘ não é neste caso) awk dividirá cada linha de entrada em campos com base no valor do separador de campo e preencherá as variáveis embutidas. mas com o que você postou, quase não deve haver diferença. De longe a diferença mais importante entre grep e awk wrt regexps correspondentes é que grep procura em toda a linha por uma string correspondente, enquanto awk pode pesquisar campos específicos e assim fornecer mais precisão e menos correspondências falsas.
Resposta
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 linhas que correspondam a uma substring ou regexp? Use grep.
- selecionando certas colunas de um arquivo simplesmente delimitado? Use cut.
- realizando substituições baseadas em padrões ou … outras coisas que o sed pode razoavelmente fazer? Use sed.
- precisa de alguma combinação dos 3 acima, ou formatação printf, ou loops e ramificações de uso geral? Use awk.
Comentários
- +1, exceto para usar
perl
em vez deawk
. se você precisa de algo mais complicado do que grep / cut / sed, então as chances são de awk won ‘ t ser o suficiente e você precisa de algo ” completo -blown ” - @sds porque não python em vez disso
- @RetroCode: python é mais ” uso geral ” do que perl; o equivalente de uma linha provavelmente será muito mais longo.
- @sds não, você não ‘ não precisa de perl a menos que ‘ vai fazer algo diferente do processamento de texto. awk é ideal para as coisas de processamento de texto que ‘ é mais complicado do que grep / cut / sed e como um bônus vem como padrão em todas as instalações UNIX, ao contrário do perl.
Resposta
Ao pesquisar apenas strings e a velocidade for importante, você deve quase sempre usar grep
. É muito mais rápido do que awk
quando se trata apenas de pesquisas grosseiras.
fonte As diferenças funcionais e de desempenho de sed, awk e outros utilitários de análise 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
Comentários
- Obrigado por esta bela visão geral de todos esses programas. Ele realmente ilumina a escuridão.
- ~ headtilt ~ PHP está lá, mas Perl não ‘ t?
- A qual
grep
e a qualawk
você está se referindo? - Ele ‘ Não é justo com os outros utilitários que grep está apenas procurando e eles também estão substituindo.
- Esses são números completamente falsos. Fale sobre como comparar maçãs e laranjas – é ‘ como dizer que você pode apenas encontrar um carro novo no site A em 5 segundos, enquanto você pode encontrar um carro , negocie um preço, obtenha um empréstimo e compre o carro no site B em 1 hora, portanto, o site A é mais rápido do que o site B. O artigo que você citou está completamente errado nele ‘ s declarações de velocidade de execução relativa entre grep, sed e awk e também diz
awk ... has PCRE matching for regular expressions
, o que é completamente falso.
Resposta
Embora eu concorde que, em teoria, grep
deve ser mais rápido do que awk
, na prática, YMMV depende muito da implementação que você usa.
aqui comparando o busybox 1.20.0 “s grep e awk, GNU grep 2.14, mawk 1.3.3, GNU awk 4.0.1 em Debian / Linux 7.0 amd64 (com glibc 2.17) em um local UTF-8 em um arquivo de 240 MB de 2,5 milhões de 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
Em o C locale, apenas GNU grep obtém um impulso significativo e se torna mais rápido do que mawk
.
O conjunto de dados, o tipo de regexp também pode fazer uma grande diferença. Para regexps, awk
deve ser comparado a grep -E
como awk
“s regexps são REs estendidos .
Para este conjunto de dados, awk
poderia ser mais rápido do que grep
em sistemas baseados em busybox ou sistemas em que mawk
é o awk
padrão e o local padrão é baseado em UTF-8 (IIRC, costumava ser o caso no Ubuntu).
Resposta
Em poucas palavras, grep
faz uma coisa apenas como muitas outras ferramentas UNIX e que “está combinando uma linha com o padrão fornecido e funciona bem. Por outro lado, awk
é uma ferramenta mais sofisticada, pois é uma linguagem de programação completa definida pelo padrão POSIX com recursos típicos como variáveis, matrizes, expressões, funções ou instruções de controle para verificação de padrões e em processamento.
Na minha opinião, depende da implementação, como ambas as ferramentas funcionam no caso de correspondência de padrões e do tamanho de alguma entrada que você deseja processar. Eu esperaria que o grep seja geralmente mais eficiente do que o awk, pois ele faz apenas correspondência. Mas você não pode escrever com grep um código simples para realizar tarefas mais complexas, como processamento adicional de registros correspondentes, computação ou impressão de resultados sem usar outras ferramentas.
time
comando para cronometrar quanto tempo leva para executar o comando. Ex:time ls -l
.