Номер телефона

Последнее обновление:

Букмарклет для поиска и показа в текстовом файле строчек с искомыми словами (фразами)

Иногда при работе с большими текстовыми файлами возникает задачи - показать только некоторые, выбранные строчки. Например, такие, которые содержат те или иные слова, символы, фразы. Это бывает необходимо, в частности, при работе с файлами-логами, журналами и пр. Нередко такие файлы содержат много строчек и потому вручную разобраться в них бывает довольно затруднительно. Возникает задача - показать только те строчки, которые содержат требуемые символы. А среди них, в свою очередь, найти, быть может, другие строчки (т.е. подмножество) с некоторыми другими символами или словами. 

Вообще говоря, задача показа требуемых строк текстового файла вполне может быть решена и уже имеющимся инструментарием

Для пример, рассмотрим текстовый редактор Notepad++. По мнению автора статьи, этот редактор - один из лучших. Если говорить именно о текстовых редакторах, а не об IDE. Там хорошо, пожалуй, всё. И легкость, скорость работы, что позволяет обрабатывать даже файлы объемом в несколько мегабайт (при том, что ряд продвинутых IDE на таких объемах если и будут работать, то очень медленно).

И интуитивно понятный интерфейс с аккуратными, но внешне привлекательными кнопками. И функционал, который, с одной стороны, содержит массу возможностей, а с другой - не является перегруженным излишними мелочами, чем страдают многие другие текстовые редакторы подобного класса. 

Новые версии этого редактора позволяют даже работать, например, с программой Git. Автору статьи пока не доводилось использовать такую возможность, но, судя по отзывам в интернете, она имеется.

К нему можно подключать словари, проверять правописание текстов. Можно назначать горячие клавиши. Отображение файла в окне редактора можно настроить, исходя из синтаксиса соответствующего языка программирования (там есть просто масса разных видов оформления для очень большого числа языков). Ну, и так далее, там еще много чего.

И, да, к тому же Notepad++ является еще и бесплатным.

На всякий случай. Этот редактор предназначен для операционной системы Windows. Если вы работаете в Linux, то есть его, тоже бесплатный, аналог - Notepadqq.

В новых версиях Notepad++ реализован даже автокомплит (т.е. автоматическое, по выбору пользователя, автозаполнение слов, например, операторов и команд в языках программирования), что приближает этот редактор даже к IDE. Также там есть возможность создавать, сохранять и запускать макросы - последовательности макрокоманд. Так вот, эта возможность позволяет выполнить поставленную выше задачу поиска и отображения только тех строк файла, которые содержат требуемые (искомые) слова, символы или фразы.

Допустим, у нас есть файл 1.log, содержащий следующие строчки:

qwer 127.0.0.1
tyui 127.0.0.4
asdf 23.76.0.0
fghj 23.75.1.0

Это - что-то типа известного файла hosts. Таких строчек в нем может быть, вообще говоря, несколько (сотен) тысяч. И вот, нам требуется найти и отобразить, например, только такие строчки, которые содержат локальные IP-адреса, начинающиеся с символов 127.0.

Приведем пример макроса, при помощи которого можно выполнить эту задачу. Вначале следует выделить и скопировать (в буфер обмена) в этом файле соответствующие символы, т.е. 127.0. Затем нажать кнопку "Старт записи" (макроса). Далее выполнить следующие операции:


  1. Ctrl+F,
  2. Ctrl+V,
  3. "Найти все в текущем документе" (возникнет дополнительное окно с результатами поиска),
  4. В этом окне правой кнопкой мыши нажать "Выделить все",
  5. При помощи правой кнопки мыши нажать "Копировать",
  6. Нажать клавишу Delete на клавиатуре (чтобы очистить содержимое окна),
  7. Закрыть дополнительное окно,
  8. Новый файл,
  9. Вставить.

После чего следует нажать "Стоп записи". В результате у нас в основном окне будет открыт новый (пока еще не сохраненный) файл с результатами поиска, т.е. там будут содержаться только те строчки, которые содержат искомые символы. Т.е., в нашем простом случае, первые две строчки исходного файла. В нем можно, в свою очередь, выделить какие-то другие символы/слова и запустить макрос снова.

Однако, макрос работает нестабильно. Результаты следующего поиска могут быть неверными. Поэтому лучше бы написать что-то более корректное и удобное, например, на языке javascript и потом сделать соответствующий букмарклет (т.е. закладку в браузере).

Создаем код на языке javascript

Вот примерный программный код:

 (function () {
begin();

function begin(){ // Создает панель поиска. Запускается изначально и после каждого нажатия кнопки поиска
var div=document.createElement('div'); // Создаем панель управления поиском
var textarea=document.createElement('textarea');
textarea.style.display='block';

div.appendChild(textarea);
textarea.value=sessionStorage.getItem('textarea'); // Сохраняем ранее введенное искомое слово в сессии браузера (оно будет сохраняться при обновлении страницы)
textarea.setAttribute('placeholder','Вставьте сюда искомую фразу или выделите ее в тексте...');
var butt=document.createElement('button'); // Создаем кнопку для запуска поиска
butt.innerHTML='<div>Показать только строки, <br/>содержащие искомые слова</div>';
butt.style.cssText='display:inline-block;margin:0;';

div.style.cssText='position:fixed;top:0;left:0;background-color:wheat;padding:3px;';
div.appendChild(butt);
document.body.appendChild(div);

var check_box=document.createElement('input'); // Создаем кнопку-флажок для возможности указания поиска без учета регистра искомых символов
check_box.setAttribute('type','checkbox');
check_box.style.verticalAlign='middle';

var div1=document.createElement('div');
div1.innerHTML='Без учета регистра:';
div1.appendChild(check_box);
div.appendChild(div1);

butt.onclick=function(){
finder(this,div,check_box);
};
}

function finder(butt,div,check_box){ // Функция осуществляет поиск искомых слов/фразы
var textarea = document.getElementsByTagName('textarea')[0];
var str = textarea.value;
var width = getComputedStyle(textarea).width;
var height = getComputedStyle(textarea).height;
var check_box_checked = check_box.checked;
var reg = /[\r\n]/g;

if(!str){
alert('Следует вставить искомые символы (слова) в область для поиска или выделить эти слова в тексте.');
return;
}else{
sessionStorage.setItem('textarea', textarea.value);
}

if(butt.onclick){
butt.onclick = null;
butt.removeAttribute('onclick');
}

document.body.removeChild(div); // Удаляем панель поиска (потом она будет создана снова)
var str_Arr = document.body.textContent.split(reg); // Разбиваем содержимое тесктового файла на строки и записываем их в массив
var str1 = str;

if(check_box_checked){ // Если бы установлен флажок регистронезависимого поиска
str1 = new RegExp(str, 'i');
}

var finded_Arr = str_Arr.filter(function (item) {
return item.match(str1); // В новый массив записываем только те строки, которые содержат искомые символы/слова/фразу
});

var pre=document.createElement('pre'); // Чтобы текст отображался именно так, как он отображается в текстовом файле с учетом концов строк
document.body.innerHTML='';
document.body.appendChild(pre);
pre.innerHTML=finded_Arr.join('\r\n'); // Объединяем все полученные строки (содержащие искомые слова) посредством концов строк

begin(); // снова создаем панель поиска

textarea = document.getElementsByTagName('textarea')[0];
textarea.value = str; // Заново устанавливаем ранее сохраненные параметры панели
textarea.style.width = width;
textarea.style.height = height;
var check_box1 = document.getElementsByTagName('input')[0];
check_box1.checked = check_box_checked;
}
})();

Скрипт - кроссбраузерный. Видимо, он будет работать даже в браузере Internet Explorer 11. Но, в старых версиях Firefox - точно работает.

Из этого скрипта следует изготовить букмарклет и сохранить его в закладках браузера. Затем, нужно открыть соответствующий текстовый файл (например, 1.log) в браузере и - запустить эту закладку, кликнув по ней мышью.

Если тектсовый файл расположен, скажем, в корневом каталоге диска С:, то в адресной строке браузера будет фигурировать что-то вроде: file:///C:/1.log.

После запуска скрипта, записанного в закладке, возникнет небольшая панель поиска, где можно ввести (вставить) искомые слова/фразу и нажать кнопку. После чего в текстовом файле, открытом в браузере, будут отображаться только те строчки, которые содержат указанное искомое слово/фразу.

Делаем букмарклет

Вообще-то, для изготовления букмарклетов имеются специальные онлайн-сервисы. Там достаточно вставить JS-код скрипта и сервис выдаст код букмарклета, который останется только добавить в закладки браузера. Но, мы сделаем его вручную, ибо это - несложно. Следует помнить лишь об определенном ограничении на объем букмарклета - разный в разных браузерах и даже версиях одного и того же браузера. Как его сделать?

1. Букмарклет может иметь следующий общий вид:

javascript:(function(){...}());

Здесь javascript: - это псевдопротокол. А вместо многоточия должен быть вставлен соответствующий JS-код. При этом следует соблюдать правила:

  1. Все комментарии необходимо удалить,
  2. Следует убрать, по возможности, лишние пробелы, символы табуляции и переносы строк в JS-коде. Т.е. их наличие не даст ошибки, но неоправданно увеличит объем букмарклета,
  3. Все оставшиеся пробелы и символы НЕлатинского шрифта (например, кириллицу) следует заменить на последовательности вида %XX. Сделать это можно, например, при помощи функции encodeURI() (язык javascript). При этом, например, пробел преобразится в последовательность %20,
  4. Если в JS-коде встречается HTML-разметка, то ее первые и последние символы необходимо экранировать символами \. Например вместо  '<div>Показать только строки</div>' получится '\<div>Показать только строки\</div>'. Если этого не сделать, то разметка будет "съедена", т.е. исчезнет.

На последний пункт почему-то никто внимания не обращает. А иногда в букмарклете все-таки удобнее и быстрее задать html-разметку, как есть, вместо того, чтобы создавать ее средствами javascript.

По идее, можно было бы самостоятельно заменить все пробелы символами %20, а также кавычки, кириллицу (см. п.3). Однако, браузер (по крайней мере, Firefox даже относительно ранних версий) прекрасно с этим справляется сам при сохранении закладки-букмарклета. Для удобства, приведем здесь готовый код букмарклета, полученный из приведенного выше JS-скрипта:

javascript:(function(){begin();function%20begin(){var%20div=document.createElement('div');var%20textarea=document.createElement('textarea');textarea.style.display='block';div.appendChild(textarea);textarea.value=sessionStorage.getItem('textarea');textarea.setAttribute('placeholder','%D0%92%D1%81%D1%82%D0%B0%D0%B2%D1%8C%D1%82%D0%B5%20%D1%81%D1%8E%D0%B4%D0%B0%20%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%D1%83%D1%8E%20%D1%84%D1%80%D0%B0%D0%B7%D1%83%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D1%8B%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D0%B5%20%D0%B5%D0%B5%20%D0%B2%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B5...');var%20butt=document.createElement('button');butt.innerHTML='\<div>%D0%9F%D0%BE%D0%BA%D0%B0%D0%B7%D0%B0%D1%82%D1%8C%20%D1%82%D0%BE%D0%BB%D1%8C%D0%BA%D0%BE%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8,<br/>%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B0%D1%89%D0%B8%D0%B5%20%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%D1%8B%D0%B5%20%D1%81%D0%BB%D0%BE%D0%B2%D0%B0\</div>';butt.style.cssText='display:inline-block;margin:0;';div.style.cssText='position:fixed;top:0;left:0;background-color:wheat;padding:3px;';div.appendChild(butt);%20document.body.appendChild(div);var%20check_box=document.createElement('input');check_box.setAttribute('type','checkbox');check_box.style.verticalAlign='middle';var%20div1=document.createElement('div');div1.innerHTML='%D0%91%D0%B5%D0%B7%20%D1%83%D1%87%D0%B5%D1%82%D0%B0%20%D1%80%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80%D0%B0:';div1.appendChild(check_box);div.appendChild(div1);butt.onclick=function(){finder(this,div,check_box);};}function%20finder(butt,div,check_box){var%20textarea%20=%20document.getElementsByTagName('textarea')[0];var%20str%20=%20textarea.value;var%20width=getComputedStyle(textarea).width;var%20height=getComputedStyle(textarea).height;var%20check_box_checked%20=%20check_box.checked;var%20reg%20=%20/[\r\n]/g;if(!str){alert('%D0%A1%D0%BB%D0%B5%D0%B4%D1%83%D0%B5%D1%82%20%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%D1%8B%D0%B5%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D1%8B%20(%D1%81%D0%BB%D0%BE%D0%B2%D0%B0)%20%D0%B2%20%D0%BE%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C%20%D0%B4%D0%BB%D1%8F%20%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0%20%D0%B8%D0%BB%D0%B8%20%D0%B2%D1%8B%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%20%D1%8D%D1%82%D0%B8%20%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%20%D0%B2%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B5.');return;}else{sessionStorage.setItem('textarea',textarea.value);}if(butt.onclick){butt.onclick=null;butt.removeAttribute('onclick');}%20%20%20%20document.body.removeChild(div);var%20str_Arr=document.body.textContent.split(reg);var%20str1=str;if(check_box_checked){str1=new%20RegExp(str,'i');}var%20finded_Arr=str_Arr.filter(function(item){return%20item.match(str1);});var%20pre=document.createElement('pre');document.body.innerHTML='';document.body.appendChild(pre);pre.innerHTML=finded_Arr.join('\r\n');begin();textarea=document.getElementsByTagName('textarea')[0];textarea.value=str;textarea.style.width%20=%20width;textarea.style.height%20=%20height;var%20check_box1=document.getElementsByTagName('input')[0];check_box1.checked=check_box_checked;}})();

Обратите внимание на экранирующие символы (см. п.4).

Чтобы быстро выделить этот код, дважды (или трижды) быстро кликните мышью где-нибудь по свободному от символов месту.

2. Добавляем букмарклет в закладки браузера

Для этого следует создать новую закладку, например, нажав на клавиатуре Ctrl+D и затем - "Готово" (или "ОК"). После чего следует открыть закладки, там найти только что созданную закладку и, при помощи правой кнопки мыши, вызвать контекстное меню а там выбрать "Свойства"

Там можно будут задать желаемое имя закладки, например, "Показать только строчки с искомыми словами". А также, что самое главное, адрес. Адресное поле следует очистить и вставить туда код букмарклета. Ну, а напоследок нажать "Сохранить". Букмарклет будет готов к работе.

Как применять данный букмарклет для отображения только требуемых строк текстового файла?

Панель, возникшая после запуска букмарклета по поиску и отображению строк, содержащих искомые слова/символы

Открываем в браузере нужный нам текстовый файл. После чего переходим в закладки, нажимаем там на наш букмарклет. Получится примерно следующее.

Так как ищем лишь цифры и точку, регистр нам вообще неважен.

После нажатия кнопки "Показать только строки...", у нас получится примерно следующее:

Результат работы букмарклета по поиску строк в текстовом файле, содержащих искомые слова и символы
 

Как видим, отобразились только первые две строчки нашего текстового файла, только те, где содержатся символы 127.0. Остальные строчки не показаны. Их на странице больше нет.

Разумеется, фактически-то они никуда не делись и остались в исходном текстовом файле, на жестком диске компьютера. Но в браузере уже не отображаются.

Если хочется, можно уже среди найденных строк делать последующие поиски. Например, найти все строки с символами qwer, или 127.0.0.1, или что-то подобное. При этом ранее скрытые строки, разумеется, уже не будут принимать участия в поиске (т.к. их нет на странице). Если же задать такие символы/слова, которых на странице нет, то в результате поиска будет отображена пустая страница. 

Примечание. Как видно, панель смещена вправо (на 250 пикселей). Это сделано вручную через средства разработчика в браузере, т.к. иначе панель будет закрывать собой строчки текста. Но, путем изменения соответствующего параметра в приведенном выше коде букмарклета, можно добиться такого смещения автоматически.

Как вернуть показ всех строк исходного файла снова?

Это несложно. Следует лишь обновить страницу в браузере. И - снова вызвать букмарклет из закладок, чтобы отобразилась панель поиска. При этом, конечно, все предыдущие результаты поиска будут потеряны.

Можно ли сохранить результаты поиска? В браузере - нет. Но, можно скопировать их со страницы и сохранить в каком-нибудь отдельном текстовом файле, если это будет необходимо.

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

Нужно сказать, что, строго говоря, браузер не особо предназначен для работы с текстовыми файлами, если они не содержат html-тегов и не имеют расширение типа htm, html, php и т.п. Поэтому в данном случае браузер уже самостоятельно создает тот минимум разметки, который позволяет ему отобразить содержимое текстового файла на экране. Превращая его как бы в некое подобие html-файла (при этом никакие теги работать там, разумеется, не будут). Иными словами, такой подход - не слишком корректен с точки зрения браузера. И он может быть назван редким. Но, вполне допустим.

И, главное, удобен. Ибо стандартные текстовые редакторы, как можно видеть на примере Notepad++, все-таки не дают той полноты функциональности, которую можно получить средствами языка javascript в браузере. И при этом не нужно писать отдельное приложение, если использовать какой-нибудь Python, C++ и т.п. Ибо достаточно закладки в бавузере.

Конечно, такую функциональность вполне можно реализовать, например, при помощи средств языка VBA текстового редактора Word. С одним только НО: там, при мало-мальски больших объемах файлов, макросы работают очень-очень медленно. На несколько порядков. Поэтому для мало-мальски серьезной работы в рамках данной функциональности Word не годится. А браузер работает гораздо быстрее.

Добавив еще несколько строчек JS-кода, можно реализовать возможность передвижения панели по экрану простым движением мыши. И/или - реализовать свертывание/развертывание панели. Можно так же сделать сохранение истории изменений, чтобы появилась возможность возврата к предыдущим результатам поиска. Можно сделать так, чтобы по мере выделения слов или символов в тексте они сами автоматически появлялись в поле для ввода искомых слов. Это избавило бы пользователя от необходимости их копирования и вставки. Ну, и т.д. Правда, если этим увлечься, в итоге получится... очередной новый текстовый редактор.

Т.е., в целом, такой подход вполне может оказать услугу, когда потребуется сделать поиск и отбор определенных строк в большом текстовом файле, а уже в них - делать последующие уточняющие поиски.

И еще. Ряд современных браузеров может затруднять работу с закладками. Например, в старых Firefox закладка вызываются легко, путем двух кликов мыши и передвижения ее указателя. Очень удобно. В более новых версиях этого браузера уже требуется не два, а три, или даже четыре клика.

Некоторые браузеры могут, якобы, "в целях безопасности", препятствовать (по умолчанию) запуску букмарклетов. Или могут создавать проблемы при работе с локальными файлами. Некоторые браузеры (типа небезызвестного Google Chrome...) нынче взяли моду не показывать протокол, по которому открыт файл в браузере. Видимо, с целью - чтобы запутать пользователя. Не говоря уж о том, что периодически появляются сообщения о "необходимости" обновления браузера и их приходится каждый раз закрывать. Все это, конечно, напрягает.

С браузером Firefox такое стало происходит после того, как, к сожалению, компания Mozzilla была куплена... корпорацией... Google. И этим все сказано.

Т.е. разработчики браузеров как будто специально создают пользователям те или иные проблемы. Будто бы принуждая их к самостоятельному написанию или изменению браузеров.

Поэтому для удобства целесообразнее, по мнению автора статьи, использовать более старые браузеры. Выпущенные годах так в 2010-2015. Они отлично и быстро работают при условии кроссбраузерной реализации скриптов на javascript, даже на сравнительно слабых компьютерах. Но, это уже тема для другой статьи.


Комментарии:
Всего комментариев:0
Пожалуйста, не забудьте ознакомиться с правилами оставления комментариев.



Подписаться на комментарии на этой странице

Мы можем выполнить

Другие услуги
Интересная и полезная
информация
НАПИШИТЕ НАМ
Яндекс.Метрика
Номер телефона
© Copyright Все права защищены 2013-2025 Научный консалтинг