В данный момент использую pidgin в качестве IM и частенько пользуюсь просмотром журналов. И обратил внимание, что поиск работает неприлично долго: от 3 до 10 секунд при размере журнала 500 кб. Не знаю с чем это может быть связано, но это натолкнуло меня на мысль: а не изобрести ли мне велосипед?
Встречаем..
Вдохновился вот этим постом, даже пытался переделать скрипт под себя, но с shell скриптом вообще не знаком, поэтому решил соорудить что-то свое на perl(с которым тоже конечно на "Вы", но что-то плохоработающее соорудить могу).
#!/usr/bin/perl
#тут у нас интерпретатор
#все серьёзно :)
use strict;
use warnings;
#подключаем поддержку utf-8
use utf8;
use encoding 'UTF-8';
use Encode qw(encode decode is_utf8);
use open ':utf8';
#тут можно указать свою любимую оперу или, скажем elinks
my $browser="firefox";
#импорт домашней директории из оболочки
chomp(my $home=`echo \$HOME`);
#ввод данных
print "Введите ICQ номер собеседника:\n";
chomp(my $icq_number=<STDIN>);
print "Введите значение для поиска:\n";
chomp (my $find_value=<STDIN>);
#удаление временной директории
`rm -r $home/temp_icq_hist/ >/dev/null`;
#создание пустой временнной директории
`mkdir $home/temp_icq_hist >/dev/null`;
#создание копии логов заданного номера
`cp -r $home/.purple/logs/icq/347298877/$icq_number \$HOME/temp_icq_hist/`;
#открываем дескриптор файла с результатами поиска
open RESULT, ">", "$home/temp_icq_hist/result.htm";
#пишем в него эту строку для правильного определения кодировки
print RESULT '<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">';
#объявляем переменные
my (@file_strings,$i,$flag,$anchor_number);
#получаем список файлов с логами
opendir DIR, "$home/temp_icq_hist/$icq_number";
my @files=readdir DIR ;
#сортируем его в обратном порядке
@files=reverse sort @files;
#для каждого из файлов..
foreach (@files) {
#открываем дескриптор очередного файла логов
open FILE, "$home/temp_icq_hist/$icq_number/$_";
#читаем файл целиком в массив
@file_strings=<FILE>;
#открываем дескриптор для этого же файла на запись
open FILE, ">", "$home/temp_icq_hist/$icq_number/$_";
#обнуление счетчика якорей
$anchor_number=0;
#начинаем построчную обработку
for ($i=0;$i<scalar(@file_strings);$i++){
#если есть совпадение с искомым значением начаем писать
if ($file_strings[$i]=~/$find_value/i){
#в файл логов пишем строку с присоединенным якорем
print FILE "<a name=\"$anchor_number\"></a>$file_strings[$i]";
#в файл результатов пишем ссылку на якорь, предыдущую строку, текущую и следующую
print RESULT "<hr>
<a href=$icq_number/$_#$anchor_number>$_</a><br>
$file_strings[$i-1];
$`<span style=\"background: rgb(153, 255, 153)\">$&</span>$'
$file_strings[$i+1]";
#увеличиваем счетчик на единицу, чтобы избежать обработки двух строк
$i++;
#номер якоря
$anchor_number++;
}
#если совпадения нет, просто пишем строку в логи
else {
print FILE $file_strings[$i];
}
}}
#закрытие дескриптора результатов
close RESULT;
#открываем файл браузером
`$browser $home/temp_icq_hist/result.htm`
И эта жуткая штука выполняется за время в пределах полутора секунд, что меня вполне устроило. Кроме того получил немного опыта и много удовольствия от процесса.
Замечания, критика, предложения по улучшению и пожелания больше никогда не брать в руки текстовый редактор приветствуются. ;)
среда, 18 ноября 2009 г.
Быстрый поиск в pidgin.
Подписаться на:
Комментарии к сообщению (Atom)
3 комментария:
Что-то как-то сложно :)
Я использую такое:
grep "что ищем" $(find ~/.purple/logs/icq/мой_номер/)
можно grep -A3 -B3 (или больше - по необходимости) "что ищем" $(find ~/.purple/logs/icq/мой_номер/номер_собеседника)
греп нынче не в моде всмысле?!
млин над чаще новости читать ....
2 yuri
Когда история в хранится в html, ее не очень удобно читать, выведенную в терминал. Хотя можно из нее sed'ом на лету теги выбрасывать.
-А3 -В3 конечно неплохо, но у меня сделано удобнее, мне кажется. +-одна строка и ссылка на нужное место в исходном файле.
2 DimoNya
Ну я же написал в начале, что велосипед изобретаю. Просто хочется попрограммировать, а не знаю чего.. Вот, нашел задачу - решил. Больше интереса в процессе, а не конечном результате.
Отправить комментарий