Como você contaria cada ocorrência de um termo em todos os arquivos no diretório atual?

10

Como você contaria cada ocorrência de um termo em todos os arquivos no diretório atual? - e subdiretórios (?)

Eu li que para fazer isso você usaria grep ; qual é o comando exato?

Além disso, é possível ao acima com algum outro comando?

    
por DevRobot 06.11.2015 / 15:10

4 respostas

12

Usando grep + wc (isso atenderá a várias ocorrências do termo na mesma linha):

grep -rFo foo | wc -l
  • -r in grep : procura recursivamente na hierarquia de diretórios atual;
  • -F in grep : corresponde a uma sequência fixa em vez de a um padrão;
  • -o in grep : imprime apenas correspondências;
  • -l in wc : imprime a contagem das linhas;
% tree                 
.
├── dir
│   └── file2
└── file1

1 directory, 2 files
% cat file1 
line1 foo foo
line2 foo
line3 foo
% cat dir/file2 
line1 foo foo
line2 foo
line3 foo
% grep -rFo foo | wc -l
8
    
por kos 06.11.2015 / 15:41
8

grep -Rc [term] * fará isso. O sinalizador -R significa que você deseja pesquisar recursivamente o diretório atual e todos os seus subdiretórios. O * é um seletor de arquivos que significa: todos os arquivos. O -c flag torna grep output apenas o número de ocorrências. No entanto, se a palavra ocorrer várias vezes em uma única linha, ela será contada apenas uma vez.

De man grep :

  -r, --recursive
          Read all files under each directory, recursively, following symbolic links only if they are on the command line.
          This is equivalent to the -d recurse option.

   -R, --dereference-recursive
          Read all files under each directory, recursively.  Follow all symbolic links, unlike -r.

Se você não tem links simbólicos em seu diretório, não há diferença.

    
por Jos 06.11.2015 / 15:27
2

Em um pequeno script python:

#!/usr/bin/env python3
import os
import sys

s = sys.argv[1]
n = 0
for root, dirs, files in os.walk(os.getcwd()):
    for f in files:
        f = root+"/"+f      
        try:
            n = n + open(f).read().count(s)
        except:
            pass
print(n)
  • Salve como count_string.py .
  • Execute o no diretório com o comando:

    python3 /path/to/count_string.py <term>
    

Notas

  • Se o termo incluir espaços, use aspas.
  • Conta todas as ocorrências do termo recursivamente, também se ocorrer várias ocorrências em uma linha.

Explicação:

# get the current working directory
currdir = os.getcwd()
# get the term as argument
s = sys.argv[1]
# count occurrences, set start to 0 
n = 0
# use os.walk() to read recursively
for root, dirs, files in os.walk(currdir):
    for f in files:
        # join the path(s) above the file and the file itself
        f = root+"/"+f
        # try to read the file (will fail if the file is unreadable for some reason)
        try:
            # add the number of found occurrences of <term> in the file
            n = n + open(f).read().count(s)
        except:
            pass
print(n)
    
por Jacob Vlijm 06.11.2015 / 15:31
2

Como uma variante da resposta do @kos, se você estiver interessado em discriminar as contagens, você pode usar a opção -c do grep para contar ocorrências:

$ grep -rFoc foo
file1:3
dir/file2:3
    
por emacs_ftw 07.11.2015 / 05:55