Последнее обновление:
Букмарклет для поиска и показа в текстовом файле строчек с искомыми словами (фразами)
Иногда при работе с большими текстовыми файлами возникает задачи - показать только некоторые, выбранные строчки. Например, такие, которые содержат те или иные слова, символы, фразы. Это бывает необходимо, в частности, при работе с файлами-логами, журналами и пр. Нередко такие файлы содержат много строчек и потому вручную разобраться в них бывает довольно затруднительно. Возникает задача - показать только те строчки, которые содержат требуемые символы. А среди них, в свою очередь, найти, быть может, другие строчки (т.е. подмножество) с некоторыми другими символами или словами.
Вообще говоря, задача показа требуемых строк текстового файла вполне может быть решена и уже имеющимся инструментарием
Для пример, рассмотрим текстовый редактор 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
. Затем нажать кнопку "Старт записи" (макроса). Далее выполнить следующие операции:
- Ctrl+F,
- Ctrl+V,
- "Найти все в текущем документе" (возникнет дополнительное окно с результатами поиска),
- В этом окне правой кнопкой мыши нажать "Выделить все",
- При помощи правой кнопки мыши нажать "Копировать",
- Нажать клавишу Delete на клавиатуре (чтобы очистить содержимое окна),
- Закрыть дополнительное окно,
- Новый файл,
- Вставить.
После чего следует нажать "Стоп записи". В результате у нас в основном окне будет открыт новый (пока еще не сохраненный) файл с результатами поиска, т.е. там будут содержаться только те строчки, которые содержат искомые символы. Т.е., в нашем простом случае, первые две строчки исходного файла. В нем можно, в свою очередь, выделить какие-то другие символы/слова и запустить макрос снова.
Однако, макрос работает нестабильно. Результаты следующего поиска могут быть неверными. Поэтому лучше бы написать что-то более корректное и удобное, например, на языке 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-код. При этом следует соблюдать правила:
- Все комментарии необходимо удалить,
- Следует убрать, по возможности, лишние пробелы, символы табуляции и переносы строк в JS-коде. Т.е. их наличие не даст ошибки, но неоправданно увеличит объем букмарклета,
- Все оставшиеся пробелы и символы НЕлатинского шрифта (например, кириллицу) следует заменить на последовательности вида %XX. Сделать это можно, например, при помощи функции
encodeURI()
(язык javascript). При этом, например, пробел преобразится в последовательность%20
, - Если в JS-коде встречается HTML-разметка, то ее первые и последние символы необходимо экранировать символами
\
. Например вместо'<div>Показать только строки</div>'
получится'\<div>Показать только строки\</div>'
. Если этого не сделать, то разметка будет "съедена", т.е. исчезнет.
На последний пункт почему-то никто внимания не обращает. А иногда в букмарклете все-таки удобнее и быстрее задать html-разметку, как есть, вместо того, чтобы создавать ее средствами javascript.
По идее, можно было бы самостоятельно заменить все пробелы символами %20
, а также кавычки, кириллицу (см. п.3). Однако, браузер (по крайней мере, Firefox даже относительно ранних версий) прекрасно с этим справляется сам при сохранении закладки-букмарклета. Для удобства, приведем здесь готовый код букмарклета, полученный из приведенного выше JS-скрипта:
Обратите внимание на экранирующие символы (см. п.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...) нынче взяли моду не показывать протокол, по которому открыт файл в браузере. Видимо, с целью - чтобы запутать пользователя. Не говоря уж о том, что периодически появляются сообщения о "необходимости" обновления браузера и их приходится каждый раз закрывать. Все это, конечно, напрягает.
Т.е. разработчики браузеров как будто специально создают пользователям те или иные проблемы. Будто бы принуждая их к самостоятельному написанию или изменению браузеров.
Поэтому для удобства целесообразнее, по мнению автора статьи, использовать более старые браузеры. Выпущенные годах так в 2010-2015. Они отлично и быстро работают при условии кроссбраузерной реализации скриптов на javascript, даже на сравнительно слабых компьютерах. Но, это уже тема для другой статьи.