l3text (или l3) это программа, которая предоставляет интерфейс к информации, записанной LiLaLo, прямо в командной строке. Результаты распознавания записываются с помощью l3-agent в базу данных SQLite, и они становятся сразу же доступными для использования с помощью l3text. l3text — это набор инструментов, для работы с транскриптами сеансов, сгруппированные под одной крышей. Некоторые примеры использования. Показать весь журнал команд в текущем контексте (начиная с текущего положения). $ l3text cat Показать только командные строки или только вывод: $ l3text cat -c $ l3text cat -o Показать последние 10 команд: $ l3text tail Показать последние 20 команд: $ l3text tail -20 Следить за текущим сеансом, то есть показывать все команды, выполняющиеся в текущем контексте: $ l3text tail -f По умолчанию показываются только команды и результаты их выполнения. Вывод можно настроить: $ l3 cat -o time,cline,output == Контекст == Все команды, которые вы набираете, и результаты их выполнения не повисают в воздухе, а дописываются в конец листов, находящихся в определённых местах. Лист, на который попадают команды называется ''контекстом записи''. Вы можете набирать команды в разных окнах, но если они находятся в одном контексте, то они запишутся на один лист, одна под другой. С другой стороны, в одном окне вы можете поменять контекст несколько раз, и команды, набиравшиеся в этих контекстах, попадут на разные листы. По умолчанию контекст равен /default , но для удобства дальнейшей работы с записями рекомендуется задавать нужный контекст, которому соответствуют выполняемые действия. Сменить текущий контекст записи можно так: l3 context /path/to/new/context Просмотреть контекст записи можно так: l3 context Итак, контекст записи (контекст агента) определяет, куда попадают команды при записи. Мы записывали команды не просто так. Мы хотим поработать с тем, что мы записали. Лист, на котором записаны команды, с которыми мы хотим поработать, определяется ''контекстом чтения''. То есть он определяет, какие именно команды из записанных ранее мы имеем в виду. По умолчанию текущий контекст чтения становится равным текущему контексту записи. Смена текущего контекста чтения: $ l3 cd /path/to/new/context или $ l3 go /path/to/new/context Просмотр доступных контекстов: $ l3 ls Просмотреть имя текущего контекста чтения: $ l3 pwd Символы : и / являются в имени контекста специальными. Символ / формирует иерархию контекстов, а символ : указывает координаты строки в контексте. Перейти на 3 команды назад: $ l3 go :-3 Перейти в контекст /adm/lab1, в его самый конец (и находиться всё время в конце, если он растёт, то есть делаются новые записи): $ l3 go /adm/lab1 Перейти в контекст /adm/lab1, на первую команду grep: $ l3 go /adm/lab1:/grep/ О том, как указывать координаты интересующих нас строк, написано ниже, в разделе «Интервалы». == Команда == l3 [ОПЦИИ1] [ИНТЕРВАЛ] [filter ВЫРАЖЕНИЕ] [grep РЕГВЫР] [КОМАНДА] [ОПЦИИ2] == Интервалы == По умолчанию операция выполняется над всеми командами, находящимися в текущем контексте, начиная с текущей точки и до его конца. Можно ограничить команды с помощью интервала: выражение выражение,выражение Примеры: -10,. последние 10 команд .,+3 от текущей команды три вниз /grep/ последняя команда grep o/grep/ последняя команда, содержащая grep в выводе (output) . текущая строка @12:23 команда, выполненная в 12:23 (12:23 текущего часа) @08:12:00 команда, выполненная в 8:12:00 (или ближайшая после этого времени) 1 первая команда в контексте $ последняя команда в контексте % весь контекст Интервал указывается перед командой, работу которой он ограничивает: l3 -10,. cat напечатать последние 10 команд равносильно этому: l3 tail -10 интервал = строка интервал = строка,строка интервал = % строка = число = -число = +число = @время = /регвыр/ = . = $ == Фильтрация == Можно указать дополнительный фильтр, который оставляет команды, которые нас интересуют. Есть два вида фильтров: * по регулярным выражениям * по вычисляемому выражению (синтаксис perl с некоторыми отличиями) grep -v regexp инверсия grep regexp прямой поиск -f полный -o только в выводе -c только в команде (по умолчанию) filter выражение == Команды == cat tail head history Все эти команды являются сокращением для одной команды. == Зачем всё это нужно == * использование данных вывода команд при автоматическом продолжении команд * быстрое выделение и копирование команд * поиск команд * привязка ко времени * подключение к журналу === Tab-completion: Данные вывода команд при наборе других команд === Вы выполнили одну команду, и хотите использовать результаты её исполнения в качестве аргумента другой. Например, вы просканировали wifi-сети: # iwlist scanning В выводе команды присутствовали названия SSID, один из которых мы будем использовать дальше. Было бы классно, если бы дальше, когда мы вводим команду # iwconfig wlan0 essid ____ мы могли использовать табуляцию при наборе essid. В качестве списка возможных продолжений должны использоваться сети, которые выдала предыдущая команда. Это становится возможным с использованием l3text (при написании соответствующих расширения для bash_completion). === Быстрое выделение и копирование команд === Ваш друг помогает вам настроить систему по джабберу. Он присылает вам команды, которые вы творчески перерабатываете и вводите в консоль. Потом, для того чтобы он видел, что получается, вы копируете результаты исполнения ему в джаббер. Например, вы хотите показать результат пяти последних команд: В самом простейшем случае (если вы используете графический-джаббер клиент) l3 tail -5 | xsel Потом идёте в джаббер-клиент и делаете: shift-insert Можно отправить ему код прямо из консоли: l3 tail -5 | sendxmpp igor@chub.in Или даже ещё проще, всё, что вы делаете будет копироваться ему: l3 tail -f | sendxmpp igor@chub.in Или, если вы не хотите, чтобы копировались команды, набранные неверно: l3 filter err!=128 tail -f | sendxmpp igor@chub.in Команды l3 не обязательно вызывать в той сессии, где идёт настройка. Вы можете их вызывать в соседнем терминале, где вообще не идёт запись. Конечно, вы должны будете указать соответствующий контекст. l3 cd /adm/lab1 (предполагается, что настройка идёт в /adm/lab1 ) === Поиск команд === Вы выполняете настройку сервера, в ходе которой сделали много инсталляций пакетов. Вы делали их в разных окнах, уже сами не помните в каких, но запись всё время шла. Вы хотите увидеть имена пакетов, которые были установлены. Простейший вариант: l3 grep apt-get Если вы помните, что начали работу по инсталляции после обеда, а всё, что было до этого, к делу не относится: l3 @14:00:00,$ grep apt-get Если вы помните, что было много инсталляций, но в некоторых из них вы неправильно указывали имена пакетов, и вы хотели бы оставить только те из них, которые выполнились успешно: l3 grep err=0 grep apt-get или l3 filter err=0&&/apt-get/ или l3 filter err=0 grep apt-get === Привязка ко времени === Вы рассказываете, как настроить какую-то вещь. Вы хотели бы, чтобы всё, что вы рассказываете, можно было использовать как основу для составления более подробного документа. Вы используете доску (или графический планшет), некоторые вещи делаются не в командной строке, а на экране с графическим интерфейсом, кроме того ваш голос записывается. Вы не можете тратить время на то, чтобы положить скриншоты в нужное место, но вы можете их сделать. Аналогично и со скринкастами. Вы можете записывать то, что вы делаете при подключении к какой-то системе, но вы не можете выполнять никаких других операций по обработке записи. Потому что на это просто нет времени. Ход вашей работы фиксируется, операции запоминаются, скриншоты помечаются временными метками. Аналогично происходит со схемами на доске, которые фотографируются и представляются в виде помеченных временными метками файлов. После того, как сеанс окончен, вы получаете его транскрипт, который можно дальше редактировать. Команды в этом транскрипте сопровождаются специальными якорями, с помощью которых они привязываются к записанному ранее сеансу. В транскрипте вы удаляете лишние команды, добавляете текст и получаете документ, который подробно описывает происходившее, причём при желании вы можете получить недостающую информацию из архива сделанных ранее операций. Туда же, в нужные (соответствующие времени) места, автоматически попадают сделанные скриншоты, скринкасты, фотографии, запись звука. === Подключение к журналу === Продолжим предыдущий пример. Вы прочитали документацию, составленную по описанной выше методике, и теперь хотите выполнить такую же настройку. В обычном случае вы просто копируете команды в свою командную строку или набираете их заново, с учётом ваших собственных условий. Можно значительно ускорить и упростить этот процесс, а так же уменьшить вероятность ошибки возможной в ходе его выполнения. Вы подключаетесь к сделанной записи: l3 go http://xgu.ru/l3/option-82 Все рассмотренные ранее команды становятся доступным. Становится доступным продолжение команд (tab completion) на основе информации, набранной в той работе и даже больше: вы можете добавить команды из контекста в историю текущего командного интерпретатора, как будто вы их сами уже выполняли. Автоматически они не добавляются, чтобы не создавать путаницы. Но вы можете их загрузить: l3 % | l3hist или, если вас интересуют только определённые команды, то с использование интервала, например: l3 @14:00,$ | l3hist Вам тогда не нужно будет их заново набирать. Достаточно прокрутить историю вверх, а потом просто выполнять по одной, нажимая ctrl-o, при этом адаптируя к своим условиям. Чтобы ещё сильнее сократить себе объём работы, можно применить процедуру адаптации, которая позволяет автоматически заменять специфические для процедуры параметры. Для этого вы вызываете: l3 parameterize l3 param (сокращённо) которая открывает текстовый редактор, где указывается два столбика параметров: что заменить и на что заменить. Например, пусть в описанном документе используются адреса: 192.168.15.1 192.168.15.254 example.com Причём составитель этого документа мог указать, что эти параметры являются специфичными, а мог не указывать. Если он указал, то совсем хорошо — тогда вам нужно просто пройтись и добавить справа, на что они должны заменяться в вашем случае. Если же он не указал, то вам нужно придумать список замен по своему вкусу. Вы вводите локализованную версию: 192.168.15.1 10.0.35.1 192.168.15.254 10.0.35.254 example.com xgu.ru Теперь, во всех выводах команды l3 будут исправленные команды и исправленные результаты их выполнения. Автопродолжение (tab completion) в шелле уже будет показывать исправленные аргументы. Историю командного интерпретатора вы тоже можете обновить, и в ней тогда будут изменённые команды. Использовать параметризацию с загрузкой удалённого контекста настолько логично, что вы можете это сделать одной командой: l3 go -p http://xgu.ru/l3/option-82