Primeiro, um nitpick: uma string como a*
na sintaxe normal da shell é uma glob, que funciona de maneira diferente das expressões regulares.
Em uma visão geral de alto nível, o interpretador de shell (ou seja, o bash) expande a string a*
para uma lista de todos os nomes de arquivos correspondentes ao padrão a*
. Estes então se tornam parte dos parâmetros da linha de comando para uma instância single de grep
(para os programadores, todas as palavras expandidas vão como strings separadas no argumento argv
de main
). Esse comando grep
único analisa os argumentos da maneira que escolher, e cabe a grep
interpretar esses argumentos como nomes de arquivos, opções, argumentos de opção, expressões regulares, etc. e tomar as ações apropriadas. Tudo ocorre seqüencialmente (AFAIK no grep
implementation usa vários threads).
Se você implementar um loop em um shell script para fazer a mesma coisa, é quase garantido que seja mais lento que o processo acima, pelos seguintes motivos. Se você criar um novo processo de grep para cada arquivo, ele certamente será mais lento devido à sobrecarga de criação do processo sendo multiplicada desnecessariamente. Se você construiu a lista de argumentos no shell script e usou uma única instância de grep
, qualquer coisa que você fizer no shell ainda será mais lenta porque os comandos do shell devem ser interpretados (pelo bash), que adiciona uma camada extra de código e você estará apenas reimplementando o que o bash já fazia internamente mais rápido no código compilado.
Quanto a escrever você mesmo em C, você provavelmente pode facilmente obter desempenho comparável ao processo descrito no primeiro parágrafo, mas é improvável que você consiga obter um ganho de desempenho suficiente sobre as implementações atuais do grep / bash para justifique o tempo gasto sem se aprofundar nas otimizações de desempenho específicas da máquina ou sacrificar a portabilidade. Talvez você possa tentar criar uma versão arbitrariamente parallelizable de grep
, mas mesmo isso pode não ajudar, já que é mais provável que você esteja limitado a I / O do que a CPU. A expansão glob e o grep já são "rápidos o suficiente" para a maioria das finalidades "normais".