Есть три варианта для поиска текста в файлах:
find /var/named/ -type f -exec grep "mytext" {} \;
grep -rl 'mytext' /var/named/
find -maxdepth 3 -name "*.*" -exec grep -l -i mytext {} \;
Какой из них будет более быстрым для поиска?
Возможно есть какие то другие варианты. Необходимо рекурсивно осуществлять поиск текста в файлах (возможно понадобится задавать маску файлам).
Поиск текста, быстродействие
Модераторы: /dev/random, Модераторы разделов
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Поиск текста, быстродействие
а это зависит от количества файлов и их размера. обойти 100000 файлов размера ноль долго, но искать в них быстро, потому вариант grep -r ИМХО будет быстрее. если 3 файла по 1000Mb, то наверное лучше find -name, она ИМХО лучше обходит. А на самом деле, имхо разница не принципиальная. ИМХО проще всего сделать индекс, и искать в этом индексе. (как и делают программы индексации).
-
sedikpoll
- Сообщения: 100
Re: Поиск текста, быстродействие
drBatty писал(а): ↑21.08.2010 01:35
а это зависит от количества файлов и их размера. обойти 100000 файлов размера ноль долго, но искать в них быстро, потому вариант grep -r ИМХО будет быстрее. если 3 файла по 1000Mb, то наверное лучше find -name, она ИМХО лучше обходит. А на самом деле, имхо разница не принципиальная. ИМХО проще всего сделать индекс, и искать в этом индексе. (как и делают программы индексации).
Файлов около ~200 штук, у них различное расширение и размер (от пару мегабайт до сотни), все они разбросаны по папкам и обновляются.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Поиск текста, быстродействие
тогда - не знаю. наверное find лучше. да, а ещё иногда ускорения можно добится так:
Код: Выделить всё
sed -n '/шаблон/q1'эта команда не будет проверять весь файл, а лишь до первого совпадения (код возврата 1), только если совпадения нет, код возврата будет 0, и придётся просмотреть весь файл. Хотя может и grep -q так умеет.
-
sedikpoll
- Сообщения: 100
Re: Поиск текста, быстродействие
cat 1
cat 2
cat 3
grep -rliq "mail" $PWD
grep -rli "mail" $PWD
sed '/mail/q1' *
Идея искать до первого совпадения в файле мне понравилась, но как видиет не получается осуществить.
+++++Добавлено:
Кажется понял, вроде бы grep и так ищет только до первого совпадения.
Код: Выделить всё
d
dfmail
dfgcat 2
Код: Выделить всё
454
ya.rucat 3
Код: Выделить всё
ffff
fgg
mailgrep -rliq "mail" $PWD
Код: Выделить всё
Ничегоgrep -rli "mail" $PWD
Код: Выделить всё
./1
./3sed '/mail/q1' *
Код: Выделить всё
d
dfmailИдея искать до первого совпадения в файле мне понравилась, но как видиет не получается осуществить.
+++++Добавлено:
Кажется понял, вроде бы grep и так ищет только до первого совпадения.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Поиск текста, быстродействие
что-то я не помню, что на 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 нет шаблона.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Поиск текста, быстродействие
1) только с -q
2) это документировано? как-бы не получилось, что только у вас так... (для sed такое поведение документировано. и поведение sed-команды q тоже как я понял - фича, а не баг)
-
Crazy
- Сообщения: 862
- Статус: Адепт Дзен.
- ОС: Mint, Win7.
Re: Поиск текста, быстродействие
Код: Выделить всё
#!/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: Поиск текста, быстродействие
Судя по времени, он действительно ищет только первое вхождение. Это даже документировано:
(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
Спасибо сказали: