Как подсчитать все вхождения термина во всех файлах текущего каталога?

Как подсчитать все вхождения термина во всех файлах текущего каталога?

Как подсчитать все вхождения термина во всех файлах текущего каталога? - и подкаталогах(?)

Я читал, что для этого нужно использовать grep; какова точная команда?

Также, возможно ли сделать то же самое с помощью какой-то другой команды?

решение1

Использование grep+ wc(это позволит учесть несколько вхождений термина в одной строке):

grep -rFo foo | wc -l
  • -rв grep: рекурсивный поиск в текущей иерархии каталогов;
  • -Fв grep: сопоставление с фиксированной строкой, а не с шаблоном;
  • -oв grep: печатает только совпадения;
  • -lв wc: печатает количество строк;
% 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

решение2

grep -Rc [term] *сделает это. -RФлаг означает, что вы хотите рекурсивно выполнить поиск в текущем каталоге и всех его подкаталогах. Это *селектор файлов, означающий: все файлы. -cФлаг выводит grepтолько количество вхождений. Однако, если слово встречается несколько раз в одной строке, оно учитывается только один раз.

От 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.

Если в вашем каталоге нет символических ссылок, то разницы нет.

решение3

В небольшом скрипте на 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)
  • Сохраните его как count_string.py.

  • Запустить егоиз каталогас помощью команды:

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

Примечания

  • Если термин содержит пробелы, используйте кавычки.
  • Он подсчитывает каждое вхождение термина рекурсивно, даже если в одной строке встречается несколько раз.

Объяснение:

# 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)

решение4

Как вариант хорошего ответа @kos, если вам интересно детализировать количество, вы можете использовать -cпереключатель grep для подсчета вхождений:

$ grep -rFoc foo
file1:3
dir/file2:3

Связанный контент