Посчитать количество вхождений слова в файлах - РЕШЕНО

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
Skala
Сообщения: 241
ОС: Gentoo

Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение Skala »

Когда-то видел на ЛОРе: А вот сколько раз употреблено такое-то слово в исходниках ядра, а вот кто оставлял свои копирайты...
В связи с этим вопрос: Как действительно посчитать, сколько раз какое-то слово встречалось в файлах? - Смотрел man find, но точ-то не уверен, что в этом направлении ищу.
Спасибо за внимание.
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение Rootlexx »

Skala, используйте grep с параметром -c (--count).
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu
Контактная информация:

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение serzh-z »

Rootlexx писал(а):
04.07.2007 14:23
grep с параметром -c
Он считает лишь строки.
Спасибо сказали:
Skala
Сообщения: 241
ОС: Gentoo

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение Skala »

Rootlexx писал(а):
04.07.2007 14:23
Skala, используйте grep с параметром -c (--count).
find же ищет по имени. А по содержимому там как?
Спасибо за внимание.
Спасибо сказали:
Аватара пользователя
broom
Бывший модератор
Сообщения: 1629
Статус: мизантроп.ка
ОС: Gentoo

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение broom »

ну например
find . | xargs grep "искомое" | wc -w
если, конечно, у вас нет всяких пробелов в именах файлов...

upd. хотя ведь можно и с одним пайпом -
grep "искомое" * | wc -w
but in the darkness, behind your smile, you scream... © Dio
Спасибо сказали:
Аватара пользователя
edoc_modnar
Бывший модератор
Сообщения: 1638
Статус: Форум больше не посещаю

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение edoc_modnar »

broom писал(а):
04.07.2007 14:49
ну например
find . | xargs grep "искомое" | wc -w
если, конечно, у вас нет всяких пробелов в именах файлов...

upd. хотя ведь можно и с одним пайпом -
grep "искомое" * | wc -w

Если нужно посчитать именно число вхождений каждого слова, то это не подходит. Кроме того, варианты сильно отличаются: второй вариант не будет искать в файлах, находящихся в поддиректории.

Но не в этом дело: по умолчанию grep выводит соответствие регекспу вместе с контекстом, то есть со всей строкой. При этом на другом конце пайпа считается число слов (wc -w). Правильно будет выводить только соответствующие регекспу слова (grep -o), а тут уже считать строки или слова - без разницы (потому что все слова будут выводиться на отдельной строке). Кроме того, изврат с xargs совсем не нужен:

Код: Выделить всё

find . -name "*.txt" -exec grep -o "fuck" '{}' \; | wc -l


Skala, а чтобы понять и разобраться:

Код: Выделить всё

man find
man grep
man wc
So long, and thanks for all the fish.
Douglas Adams, The Hitchhiker's Guide to the Galaxy
Спасибо сказали:
Skala
Сообщения: 241
ОС: Gentoo

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение Skala »

random_code писал(а):
04.07.2007 15:19

Код: Выделить всё

find . -name "*.txt" -exec grep -o "fuck" '{}' \; | wc -l

Skala, а чтобы понять и разобраться:

Код: Выделить всё

man find
man grep
man wc
Большое спасибо за оба варианта (к сожалению, сейчас я не дома, когда приду домой- обязательно посмотрю)!
Спасибо за внимание.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение t.t »

random_code писал(а):
04.07.2007 15:19
изврат с xargs
Ну, положим, что больший изврат -- xargs или find -exec -- можно ещё поспорить :)
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
edoc_modnar
Бывший модератор
Сообщения: 1638
Статус: Форум больше не посещаю

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение edoc_modnar »

t.t писал(а):
05.07.2007 23:17
random_code писал(а):
04.07.2007 15:19
изврат с xargs
Ну, положим, что больший изврат -- xargs или find -exec -- можно ещё поспорить :)

По-моему, больший изврат там, где нужно больше пайпов (:
So long, and thanks for all the fish.
Douglas Adams, The Hitchhiker's Guide to the Galaxy
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable
Контактная информация:

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение Portnov »

Если чо, у grep-а есть опция "-c" :)
grep -rc linus /usr/src/linux
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение t.t »

random_code писал(а):
05.07.2007 23:36
По-моему, больший изврат там, где нужно больше пайпов (:
Это по-твоему. :) А по-моему, читабельность и скорость важнее.

Portnov писал(а):
06.07.2007 11:49
Если чо, у grep-а есть опция "-c" :)
grep -rc linus /usr/src/linux
Уже обсуждалось выше, это не то, что нужно:
(man grep) писал(а):-c, --count
Suppress normal output; instead print a count of matching lines for each input file.


t.t писал(а):
06.07.2007 22:36
читабельность и скорость
Оп-па.. Интересно. Потестировал на предмет скорости (дабы не оставаться голословным, ага :) )... Ну, насчёт самой скорости всё как и ожидалось, но вот результаты -- разные; причём сильно разные:

Код: Выделить всё

$ time (find . -exec grep -o "op" '{}' \; | wc -l)
301043

real    2m37.804s
user    0m36.318s
sys     0m40.911s
$ time (find . -print0 | xargs -0 grep -o "op" | wc -l)
319473

real    1m37.292s
user    0m13.297s
sys     0m8.217s
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
edoc_modnar
Бывший модератор
Сообщения: 1638
Статус: Форум больше не посещаю

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение edoc_modnar »

Ну ничего необычного. Чем больше входных файлов, тем более заметен отрыв в скорости. Потому что в моем случае создается новый процесс grep для каждого файла. С xargs все зависит от ограничений ОС на число аргументов и их длинну.
So long, and thanks for all the fish.
Douglas Adams, The Hitchhiker's Guide to the Galaxy
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение Rootlexx »

А второй тест проводился сразу после первого? Тогда большая часть файлов находилась в кэше.
Спасибо сказали:
Аватара пользователя
edoc_modnar
Бывший модератор
Сообщения: 1638
Статус: Форум больше не посещаю

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение edoc_modnar »

Я тоже так думал, пока не провел тесты на своей системе:

Код: Выделить всё

rc@random ~ $ cd /usr/src/linux
rc@random linux $ time (find . -print0 | xargs -0 grep -o "op" | wc -l)
301451

real    0m48.585s
user    0m5.584s
sys     0m3.936s
rc@random linux $ time (find . -exec grep -o "op" '{}' \; | wc -l)
301451

real    4m55.437s
user    3m26.645s
sys     0m40.875s

Так что признаю, что я - осел, а xargs в данном случае - не изврат (:

Все-таки создание процесса - дорогая штука (как и вызов функции). Керниган и Ритчи нас надули. Два раза. И почти в одинаковых местах (:
So long, and thanks for all the fish.
Douglas Adams, The Hitchhiker's Guide to the Galaxy
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Посчитать количество вхождений слова в файлах - РЕШЕНО

Сообщение t.t »

Мне всё-таки другое интересно: почему разный результат мог получиться...
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Ответить