É mais ou encontra mais recursos intensivos para encontrar o número de vezes que um item é listado em um arquivo?

0

Li recentemente Como encontrar o número total de ocorrências de texto e arquivos com o comando find , que perguntaram sobre uma maneira de encontrar o número de vezes que o texto" abc "aparece em um arquivo. A resposta lá forneceu o comando find . -name "*.txt" | xargs grep -i "abc" | wc -l para encontrar a contagem.

Anteriormente, eu usei algo como more "file_name*" |grep "abc" |wc -l para listar o número se o texto "abc" aparecer em um arquivo específico (s).

Eu tentei isso e descobri que o comando more retornou mais rápido, mas parecia usar ~ 30% mais CPU (eu também estava monitorando via top ) do que o comando find .

Eu queria saber se alguém tinha mais dados sólidos sobre quais desses dois comandos seriam mais intensivos em recursos se você consultasse aproximadamente 15 arquivos? Como cerca de 30 arquivos?

    
por SirCobalt 04.05.2012 / 17:13

3 respostas

5

Você não precisa de more (ou cat ) se você tem a lista de arquivos que você precisa para grep: apenas dê grep os arquivos como um argumento (não há necessidade de enviar os dados através de uma segunda ferramenta ):

grep -i abc *.txt | wc -l

A principal diferença é que find não apenas listará os arquivos no diretório atual (como a expansão do shell de *.txt ), mas também recorrerá aos subdiretórios:

find . -name "*.txt" | xargs grep -i abc | wc -l

No segundo caso, se houver alguns arquivos *.txt em subdiretórios, eles também serão fornecidos como argumentos para o comando grep .

E, a propósito, grep tem uma opção -c para contar as ocorrências (não há necessidade de wc )

grep -c -i abc *txt

também fornecerá o número de ocorrências por arquivo e não o total

    
por 04.05.2012 / 17:31
1

Eu não tenho "dados sólidos", mas considere isso.

more é um filtro (primitivo) para paginar o texto de uma tela por vez. Sua intenção é ser usado interativamente "para visualização crt". Portanto, mesmo que você esteja enviando a saída para um pipe , ela ainda está usando os recursos de memória e CPU para exibir cada arquivo para você com os recursos de filtragem que o more oferece.

Seria mais correto no seu exemplo usar cat em vez de more . Dando um passo adiante, seu comando de exemplo pode se tornar ainda mais eficiente descartando a etapa adicional de passar por um programa de filtragem e ter grep procurando diretamente pelos arquivos (em vez de direcionar a saída para ele).

Com relação ao comando find sendo mais lento, find também está percorrendo a estrutura de diretórios a partir de . , enquanto more está trabalhando apenas em "file_name *" no diretório de trabalho atual.

    
por 04.05.2012 / 17:28
1

Ele só parece à primeira vista como uma tentativa de uso inútil do prêmio de gato, mas se nós catarmos todos os arquivos, antes de invocar o grep:

cat *.txt | grep -ci abc  

grep conta a soma para você. Já que você gosta de percorrer subdiretórios (você gosta, não é?), Você também pode fazer isso lá:

find -name "*.txt" -exec cat {} + | grep -ci abc
    
por 04.05.2012 / 22:48