Se tudo o que você está fazendo é correspondência de padrões em linhas individuais, é quase impossível superar grep
(ou zgrep
- que é basicamente uma implementação mais chique de zcat | grep
) para velocidade. Esse é o único propósito de grep
, e foi otimizado ao longo de décadas exatamente para essa tarefa.
É também a ÚNICA coisa que grep
pode fazer. O que também é parte da razão pela qual é tão rápido.
Se você precisar fazer mais do que isso (ex: parte de saída de uma linha se corresponder a um padrão e opcionalmente parte de outra linha se a primeira condição for verdadeira e a segunda linha corresponder a um padrão diferente - como na sua tarefa) isso é muito mais complexo e além do que o grep
pode fazer.
Esse nível de complexidade é inerentemente mais lento do que apenas uma correspondência de padrão simples. Não há como evitar isso. É mais trabalho para o programa, e sempre será mais trabalho.
No entanto, algumas linguagens são mais rápidas do que outras em determinadas coisas e, pelo menos tão importante, o algoritmo que você escolhe para implementar sua tarefa (ou seja, como você escolhe fazê-lo) pode ter um enorme impacto no desempenho. / p>Ao processar arquivos pequenos ou médios, a diferença de desempenho é insignificante, provavelmente nem perceptível, mas ao processar arquivos enormes (ou quando executados repetidamente, milhares de vezes) até pequenas diferenças de desempenho se somam e fazem uma diferença muito significativa para o tempo de execução.
por exemplo. seu script de shell original seria extremamente lento comparado a awk
ou perl
ou python
(levando horas em vez de minutos, no mínimo) - isso é porque sh não é muito bom nessas tarefas. looping sobre dados de entrada de um arquivo em particular é muito lento em sh. O objetivo principal do shell é o controle de tarefas interativo e / ou de script, não fazer processamento de texto complexo por si só ( bash
e zsh
são muito mais capazes do que o antigo sh
a esse respeito, mas um processamento de texto dedicado linguagem como awk
ou perl
será sempre melhor e mais rápida).
Resumindo:
- escolha a melhor ferramenta para o trabalho
- implemente um algoritmo rápido e bom.
BTW, "best" não é apenas a ferramenta mais adequada para o trabalho, mas também, em parte, a que você conhece melhor, e quão fácil será escrever o que você precisa nesse idioma. por exemplo. para muitas tarefas, awk
e perl
têm desempenho aproximadamente semelhante ( awk
é normalmente um pouco mais rápido, mas perl
tem muito mais funções integradas E uma biblioteca enorme de código para fazer quase tudo que você possa imaginar de, chamado CPAN . Se você conhece awk melhor que perl, então use awk. e vice-versa.
Eu costumo usar o awk para trabalhos mais simples e perl para os mais complexos. às vezes eu uso python, mas a maioria das coisas que eu escrevo são mais adequadas para perl do que python e eu sei perl muito melhor do que eu sei python.