Поиск текста, быстродействие

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

Модераторы: /dev/random, Модераторы разделов

sedikpoll
Сообщения: 100

Поиск текста, быстродействие

Сообщение sedikpoll »

Есть три варианта для поиска текста в файлах:

find /var/named/ -type f -exec grep "mytext" {} \;
grep -rl 'mytext' /var/named/
find -maxdepth 3 -name "*.*" -exec grep -l -i mytext {} \;

Какой из них будет более быстрым для поиска?
Возможно есть какие то другие варианты. Необходимо рекурсивно осуществлять поиск текста в файлах (возможно понадобится задавать маску файлам).
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Поиск текста, быстродействие

Сообщение drBatty »

sedikpoll писал(а): ↑
21.08.2010 01:00
Какой из них будет более быстрым для поиска?

а это зависит от количества файлов и их размера. обойти 100000 файлов размера ноль долго, но искать в них быстро, потому вариант grep -r ИМХО будет быстрее. если 3 файла по 1000Mb, то наверное лучше find -name, она ИМХО лучше обходит. А на самом деле, имхо разница не принципиальная. ИМХО проще всего сделать индекс, и искать в этом индексе. (как и делают программы индексации).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
sedikpoll
Сообщения: 100

Re: Поиск текста, быстродействие

Сообщение sedikpoll »

drBatty писал(а): ↑
21.08.2010 01:35
sedikpoll писал(а): ↑
21.08.2010 01:00
Какой из них будет более быстрым для поиска?

а это зависит от количества файлов и их размера. обойти 100000 файлов размера ноль долго, но искать в них быстро, потому вариант grep -r ИМХО будет быстрее. если 3 файла по 1000Mb, то наверное лучше find -name, она ИМХО лучше обходит. А на самом деле, имхо разница не принципиальная. ИМХО проще всего сделать индекс, и искать в этом индексе. (как и делают программы индексации).

Файлов около ~200 штук, у них различное расширение и размер (от пару мегабайт до сотни), все они разбросаны по папкам и обновляются.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Поиск текста, быстродействие

Сообщение drBatty »

sedikpoll писал(а): ↑
21.08.2010 01:41
Файлов около ~200 штук, у них различное расширение и размер (от пару мегабайт до сотни), все они разбросаны по папкам и обновляются.

тогда - не знаю. наверное find лучше. да, а ещё иногда ускорения можно добится так:

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

sed -n '/шаблон/q1'

эта команда не будет проверять весь файл, а лишь до первого совпадения (код возврата 1), только если совпадения нет, код возврата будет 0, и придётся просмотреть весь файл. Хотя может и grep -q так умеет.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
sedikpoll
Сообщения: 100

Re: Поиск текста, быстродействие

Сообщение sedikpoll »

cat 1

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

d
dfmail
dfg

cat 2

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

454
ya.ru

cat 3

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

ffff
fgg
mail

grep -rliq "mail" $PWD

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

Ничего

grep -rli "mail" $PWD

sed '/mail/q1' *

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

d
dfmail


Идея искать до первого совпадения в файле мне понравилась, но как видиет не получается осуществить.


+++++Добавлено:
Кажется понял, вроде бы grep и так ищет только до первого совпадения.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Поиск текста, быстродействие

Сообщение drBatty »

sedikpoll писал(а): ↑
21.08.2010 02:54
Идея искать до первого совпадения в файле мне понравилась, но как видиет не получается осуществить.

что-то я не помню, что на sed я чего-то не осуществил:

Shell

$ sed -sn '/mail/{ p; :l; n; $!bl } ' * dfmail mail


;)
Хотя тут всё идёт загрузка всего файла, нет только поиска. Наверное выигрыш будет небольшой, если будет. Проблема тут в том, что команда q прерывает обработку ВСЕХ файлов, даже с ключом -s (этот ключ заставляет рассматривать каждый файл как отдельную сущность, без ключа -s sed вообще сливает все файлы в один большой поток). Но с find эта конструкция вполне жизнеспособна:

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

find -type f -exec sed '/mail/q1' {} \; -printf "NOT FOUND in %f\n"
d
dfmail
454
NOT FOUND in 2
ffff
fgg
mail

действительно, в файле 2 нет шаблона.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Поиск текста, быстродействие

Сообщение drBatty »

sedikpoll писал(а): ↑
21.08.2010 02:54
Кажется понял, вроде бы grep и так ищет только до первого совпадения.

1) только с -q
2) это документировано? как-бы не получилось, что только у вас так... (для sed такое поведение документировано. и поведение sed-команды q тоже как я понял - фича, а не баг)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Поиск текста, быстродействие

Сообщение Crazy »

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

#!/usr/bin/perl

my $dir = $ARGV[0];
my $find_text = $ARGV[1];

use File::Find;
find(\&wanted, "$dir");
sub wanted
{
 if(-T )
 {
   open(FILE, "$File::Find::name") or die "can't open file $!";
   while(<FILE>)
   {
     if(/$find_text/)
     {
       print "$File::Find::name\n";
       last;
     }
   }
   close(FILE);
 }
}

Desipere in loco
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Поиск текста, быстродействие

Сообщение ZyX »

drBatty писал(а): ↑
21.08.2010 03:26
sedikpoll писал(а): ↑
21.08.2010 02:54
Кажется понял, вроде бы grep и так ищет только до первого совпадения.

1) только с -q
2) это документировано? как-бы не получилось, что только у вас так... (для sed такое поведение документировано. и поведение sed-команды q тоже как я понял - фича, а не баг)

Судя по времени, он действительно ищет только первое вхождение. Это даже документировано:
(man grep) писал(а):-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit
immediately with zero status if any match is found, even if an
error was detected. Also see the -s or --no-messages option.
(-q is specified by POSIX.)

Ещё есть ключ -m, определяющий, сколько вхождений grep должен найти прежде чем завершить поиск.

zyx@zyx-desktop

(zyx:~/tmp/app-office:openoffice-3.0.0:20081221-185207.test) % time grep -q gcc app-office:openoffice-3.0.0:20081221-185207.log grep --color=auto -q gcc app-office:openoffice-3.0.0:20081221-185207.log 0,00s user 0,00s system 79% cpu 0,003 total (zyx:~/tmp/app-office:openoffice-3.0.0:20081221-185207.test) % time grep -m1 gcc app-office:openoffice-3.0.0:20081221-185207.log >/dev/null grep --color=auto -m1 gcc app-office:openoffice-3.0.0:20081221-185207.log > 0,00s user 0,00s system 74% cpu 0,003 total (zyx:~/tmp/app-office:openoffice-3.0.0:20081221-185207.test) % time grep gcc app-office:openoffice-3.0.0:20081221-185207.log >/dev/null grep --color=auto gcc app-office:openoffice-3.0.0:20081221-185207.log > 1,99s user 0,15s system 52% cpu 4,057 total


Спасибо сказали: