Как Вы считали бы каждое возникновение термина во всех файлах в текущем каталоге?

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

Я считал, что, чтобы сделать это Вы использовали бы grep; какова точная команда?

Кроме того, действительно ли это возможно к вышеупомянутому с некоторой другой командой?

10
задан 6 November 2015 в 07:10

4 ответа

Используя 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
12
ответ дан 23 November 2019 в 04:20

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

$ grep -rFoc foo
file1:3
dir/file2:3
2
ответ дан 23 November 2019 в 04:20

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.

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

8
ответ дан 23 November 2019 в 04:20

В маленьком сценарии 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)
2
ответ дан 23 November 2019 в 04:20

Другие вопросы по тегам:

Похожие вопросы: