3

Как подсчитать все количество вхождений определенной строки во всех файлах в папке

Например,

1.txt: «хахаха хе» 2.txt: «ха хи»

Я хотел бы посчитать количество вхождений 'ha' в папке, содержащей все эти файлы.

То, что я мог думать о том,

grep "ха" | туалет-л

Но это просто дает мне отдельные случаи при выводе файла

2 ответа2

4

Ты рядом. Чтобы получить общее количество всех вхождений "ha" во всех TXT-файлах в папке:

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

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

Это работает, потому что каждое совпадение печатается на отдельной строке, что позволяет wc -l подсчитать их все.

Однако по умолчанию grep находит только первое вхождение в строке и выводит всю строку. Аналогично, опция -c находит только первое вхождение во всех строках, а затем выводит, сколько строк имело 1 (или более) совпадений.

РЕДАКТИРОВАТЬ:

Вот способ напечатать общее количество вхождений в каждом отдельном файле (с именами файлов):

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

#Example output
3 file1.txt
1 file2.txt

Объяснение:

find *.txt - находит .txt файлы

-printf - печатает все между одинарными кавычками (отформатированными) в стандартный вывод, заменяя вхождения %p на вывод find (имена файлов)

$(grep -o "ha" %p | wc -l) - работает как указано выше

| sh - выходные данные из -printf (которые являются командами) передаются в оболочку и выполняются

Обратите внимание, что printf вызывается один раз для каждого имени файла.

3

Вместо использования grep попробуйте использовать ag -c ha SilverSearcher:

1.txt:3
2.txt:1

Это быстрее! Если вы используете Ubuntu, вы можете установить пакет silversearcher-ag .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .