Я использую команду linux 'script' http://www.linuxcommand.org/man_pages/script1.html для отслеживания некоторых интерактивных сессий. Выходные файлы этого содержат непечатаемые символы, в том числе мои нажатия клавиш возврата.
Есть ли способ привести в порядок эти выходные файлы, чтобы они содержали только то, что отображалось на экране?
Или есть другой способ записи сеанса интерактивной оболочки (ввод и вывод)?
Ответы:
Если вы хотите просмотреть файл, вы можете отправить вывод через
col -bp
; это интерпретирует управляющие символы. Тогда вы можете пройти через меньшее, если хотите.В некоторых системах
col
не принимают аргумент имени файла, используйте этот синтаксис:источник
col
не принимал имя файла, поэтому я сделалcol -bp < typescript
и получил то, что хотел.less -R
само по себе обеспечивает лучшую производительность, чем вcol -bp
первую очередь.col -bp <typescript | less -R
не отображает цветную консоль. Использованиеless -R typescript
отображает раскрашенную консоль!less
.Вот некоторая интерпретация ввода строки в
perl
:s/pattern//g
означает сделать подстановку для всей (g
опция означает сделать всю вещь вместо остановки на первой замене) входной строкиВот некоторая интерпретация шаблона регулярных выражений:
\e
соответствует специальному управляющему символу «escape» (ASCII 0x1A)(
и)
являются началом и концом группы|
означает, что группа может соответствовать одному из N шаблонов. где N моделей[^\[\]]
или\[.*?[a-zA-Z]
или\].*?\a
[^\[\]]
средства[
и]
\[.*?[a-zA-Z]
средства[
затем сделайте не жадный.*?
до первого альфа-символа\].*?\a
средства]
затем делайте не жадный,.*?
пока вы не нажмете специальный управляющий символ, называемый «символ предупреждения (колокол)»источник
typescript
кperl
программе , которая удаляет некоторые управляющие символы с выхода, затем трубы на выходе в UNIXcol
команды, чей-b
параметр удаляет «Delete» ключевые артефакты в стенограмме. Затем он передает данные в текстовый файл.Для большого количества
script
вывода я бы итеративно взламывал Perl-скрипт. В противном случае отредактируйте вручную с помощью хорошего редактора.Маловероятно, чтобы существовал автоматизированный метод удаления управляющих символов из
script
вывода способом, который воспроизводит то, что отображалось на экране в определенные важные моменты (например, когда хост ожидал этого первого символа некоторого пользовательского ввода).Например, экран может быть пустым, за исключением того
Andrew $
, что если вы затем набралиrm /*
и нажали клавишу Backspace двенадцать раз (гораздо больше, чем нужно), то, что будет показано на экране в конце, зависит от того, какая оболочка была запущена, каковы ваши текущиеstty
настройки ( который вы могли бы изменить на полпути через сеанс) и, возможно, некоторые другие факторы.Вышесказанное относится к любому автоматизированному способу непрерывного захвата ввода и вывода. Основной альтернативой является создание «снимков экрана» или вырезание и вставка экрана в подходящее время во время сеанса (что я и делаю для руководств пользователя, заметок для дневника и т. Д.).
источник
Ответом на вторую часть моего вопроса является использование средства ведения журнала в gnu screen:
^A H
из сеанса работающего экрана. Документация находится по адресу http://www.gnu.org/software/screen/manual/screen.html#Logging.источник
Я использовал
cat filename
который удаляет управляющие символы :-)источник
Если вам нужно записать ваши команды (например, чтобы потом превратить их в скрипт bash), тогда разумный хак - запустить
script(1)
, а затем запуститьПосле
grep
этого выходной файл (обычно «машинопись») ищет строки, начинающиеся с «+». Регулярное выражение^\+
сделает свое дело.источник
Если вы хотите записать вывод в файл:
используйте команду unix2dos для преобразования файла в формат Windows, если хотите
источник
col-bp обрабатывает возвраты по желанию (AFAIK). Но это мешает цветовой последовательности побега. Возможно, было бы хорошо сначала удалить последовательности цветов, а затем обработать возвраты, если это возможно.
Это очень распространенная потребность, и я удивлен, что нет больше решений для этого. Сценарий сеанса чрезвычайно распространен, тогда кто-то должен пересмотреть процедуру. Вы хотите вырезать все мелкие ошибки при наборе и цветовые escape-последовательности, чтобы создать «чистый» сценарий процедуры для дальнейшего использования. Простой текст ASCII предпочтителен. Я думаю, что это то, что подразумевается под «читабельным человеком», и это очень разумная вещь.
источник
Я обнаружил, что ответ, предложенный dewtall на аналогичный вопрос на плате Unix, более эффективен при удалении управляющих символов из вывода скрипта, если вы находитесь в среде, где вам доступен Perl.
сценарий dewtall:
Чтобы удалить управляющие символы:
источник
https://github.com/RadixSeven/typescript2txt был написан для решения этой проблемы.
Прошло 4 года с тех пор, как я последний раз обновлял / использовал его, но я не помню, чтобы я делал что-то необычное, что не должно работать сегодня.
источник
Я нашел хороший способ сделать это. В моей системе длинные выходные строки посыпаются символом «^ M» (пробел, за которым следует возврат каретки). Символ «^ M» может быть заменен нулевым символом «^ @», который вообще не отображается при просмотре файла.
Я также фиксирую время, поэтому, чтобы воспроизвести файл идеально, я не могу просто полностью удалить «^ M», используя команды ниже (потому что скрипт запускает подсчет байтов):
Я запускаю команду сценария следующим образом:
Итак, что я делаю потом:
Первое редактирование (до воспроизведения) сохраняет количество байтов в файле. Второе редактирование (после воспроизведения) избавляет от пробелов в случайных местах. (Обратите внимание, что по умолчанию scriptreplay ищет входной файл с именем «typcript», поэтому я не предоставил его после «хронометража».)
источник
DOS2UNIX на выходе также сделает свое дело
источник
Еще одно решение заключается в использовании
strings
печатать только печатные символы из файла (или из стандартного ввода):-n 1
Опция устанавливает минимальную длину последовательностей должны быть сохранены в одной и тем самым гарантирует , что даже единичные печатные символы , окруженные непечатаемых символов сохраняются.Одним из возможных недостатков этого подхода является
strings
добавление разрывов строк между смежными строками печатаемых символов. Например, файл с содержанием(где
<SOMECONTROLCHAR>
контрольный символ или любой другой непечатаемый символ) будет возвращен какДругая проблема, поднятая в комментариях, состоит в том, что некоторые последовательности управляющих символов состоят из комбинации как печатных, так и непечатных символов, и этот подход удалит только часть из них.
Тем
strings
не менее, делает хорошую работу по удалению управляющих символов, таких как Backspace, упомянутый в вопросе.источник
strings
не удаляет все непечатаемые символы Он идентифицирует и печатает последовательности печатных символов . Это не одно и то же.strings
печатаются только последовательности минимальной длины 4. Я исправил свой ответ, добавив-n 1
опцию, которая устанавливает минимальную длину равной 1. Спасибо за указание на это.strings
удаляет все непечатаемые символы, поэтому он все равно не так, как до редактирования. Это также очевидно нарушено, потому что «некоторый цветовой код» (и управляющие коды в целом) часто состоит из печатных и непечатных символов. Например, последовательность управляющих кодов для изменения цвета текста может бытьESC[01;52m
гдеESC
есть один управляющий символ (значение байта 27). Использование,strings
как вы предлагаете, оставит[01;52m
в выводе, что не имеет смысла.strings
может не выполнять ту же работу, что и некоторые другие ответы, но ИМХО это правильный подход к решению проблемы, описанной в вопросе.