Contando o número de ocorrências de uma string em todos os arquivos em uma pasta

3

Como faço para contar todo o número de ocorrências de uma determinada string em todos os arquivos em uma pasta

Por exemplo,

1.txt: 'hahaha hehe' 2.txt: 'ha hee'

Eu gostaria de contar o número de ocorrências de 'ha' em uma pasta contendo todos esses arquivos.

O que eu consegui pensar é

grep "ha" | wc-l

Mas isso só me dá ocorrências individuais na saída do arquivo

    
por aceminer 12.03.2016 / 03:54

2 respostas

4

Você está perto. Para obter uma contagem total de todas as ocorrências de "ha" em todos os arquivos .txt em uma pasta:

grep -o "ha" *.txt | wc -l

De man grep :

-o, --only-matching
       Print only the matched (non-empty) parts of a matching line, with
       each such part on a separate output line.

Isso funciona porque a correspondência each é impressa em uma linha separada, permitindo que wc -l conte todos eles.

Por padrão, no entanto, o grep só encontra a primeira ocorrência em uma linha e produz a linha inteira. Da mesma forma, a opção -c encontra apenas a primeira ocorrência em todas as linhas e, em seguida, mostra quantas linhas tinham 1 (ou mais) correspondências.

EDITAR:

Aqui está uma maneira de imprimir o número total de ocorrências dentro de cada arquivo individual (com nomes de arquivos):

find *.txt -printf 'echo "$(grep -o "ha" %p | wc -l) %p";' | sh

#Example output
3 file1.txt
1 file2.txt

Explicação:

find *.txt - encontra arquivos .txt

-printf - imprime tudo entre aspas simples (formatadas) para a saída padrão, substituindo as ocorrências de %p pela saída do find (nomes de arquivos)

$(grep -o "ha" %p | wc -l) - funciona como acima

| sh - a saída de -printf (que são comandos) é canalizada para um shell e executada

Observe que o printf é chamado uma vez por nome de arquivo.

    
por 12.03.2016 / 06:53
2

Em vez de usar grep , tente usar ag -c ha SilverSearcher :

1.txt:3
2.txt:1

É mais rápido! Se você estiver usando o Ubuntu, você pode instalar o pacote silversearcher-ag .

    
por 14.03.2016 / 11:29

Tags