Як очистити вивід команди linux 'script'


29

Я використовую команду linux 'script' http://www.linuxcommand.org/man_pages/script1.html для відстеження деяких інтерактивних сеансів. Вихідні файли містять символи без друку, включаючи натискання клавіш Backspace.

Чи є спосіб привести в порядок ці вихідні файли, щоб вони містили тільки те, що було показано на екрані?

Або чи є інший спосіб запису інтерактивної оболонки (вхід і вихід)?


"Або чи є інший спосіб запису інтерактивної оболонки (вхід і вихід)?" Чи ти знаєш asciinema.org ?
masterxilo

Відповіді:


30

Якщо ви хочете переглянути файл, ви можете надіслати його через col -bp; це інтерпретує керуючі символи. Тоді ви можете прокочувати менше, якщо хочете.

col -bp typescript | less -R

На деяких системах col не прийме аргумент назви файлу, замість цього використовуйте цей синтаксис:

col -bp <typescript | less -R

1
у моїй системі, col не прийняв би ім'я файлу, тому я і зробив col -bp < typescript і отримав те, що я хотів.
Andrew

Не працює для мене, скремблює деякі вихідні дані.
Alex

1
У моїй системі less -R сам по собі забезпечує кращий вихід, ніж трубопровід col -bp спочатку.
Brian Hawkins

@BrianHawkins я згоден. Використання col -bp <typescript | less -R не відображає кольорову консоль. Використання less -R typescript відображає кольорову консоль!
Trevor Boyd Smith

це добре, тільки якщо ви хочете переглянути скрипт в інтерактивному режимі less.
Trevor Boyd Smith

16
cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed

ось деякі інтерпретації вводу рядка perl:

  • s/pattern//g означає зробити заміну на всю ( g опція означає зробити всю річ замість того, щоб зупинятися на першій підстановці)

ось деяка інтерпретація шаблону регулярних виразів:

  • \e відповідати спеціальному символу керування "уникнути" (ASCII 0x1A)
  • ( і ) є початком і кінцем групи
  • | означає, що група може відповідати одному з N шаблонів. де N образів
    • [^\[\]] або
    • \[.*?[a-zA-Z] або
    • \].*?\a
  • [^\[\]] засоби
    • збігаються з набором символів НЕ, де знаки не є [ і ]
  • \[.*?[a-zA-Z] засоби
    • відповідати рядку, що починається з [ потім зробіть не жадібний .*? до першого альфа-символу
  • \].*?\a засоби
    • відповідати рядку, що починається з ] потім зробіть не жадібний .*? поки ви не влучите спеціальний контрольний символ, який називається "сигнал попередження (дзвоник)"

1
Мені ще потрібно з'ясувати, як, але це дійсно працює;)
asdmin

@asdmin - в основному, це відлуння вихідних даних typescript до a perl програма, яка видаляє певні керуючі символи з виводу, а потім пропускає вихід до unix col команди, чиї -b опція видаляє будь-які артефакти ключа "видалити" у транскрипті. Потім він виводить дані у текстовий файл.
Peter Nore

Це скремлює вихідні дані в першому рядку машинописного тексту для мене, але це найкраща відповідь.
Alex

Здається, це добре працює з деякими машинописними текстами; це, звичайно, більш читабельне, ніж вихідний результат прийнятої відповіді.
fakedad

легендарна відповідь!
zack

2

Для великої кількості script Вихідні дані, я б зламати Perl скрипт разом iteratively. В іншому випадку редагуйте з хорошим редактором.

Навряд чи існує автоматизований метод видалення контрольних символів з script виводити таким чином, щоб відтворювати те, що було показано на екрані в певні важливі моменти (наприклад, коли хост чекав цього спочатку символу введення користувача).

Наприклад, екран може бути пустим, за винятком Andrew $, якщо ви потім набрали rm /* і натиснув клавішу Backspace дванадцять разів (набагато більше, ніж потрібно), що показується на екрані в кінці, що залежить від того, який оболонка працювала, який ваш поточний stty налаштування (які можна змінити через сеанс) і, можливо, інші фактори.

Вищезазначене стосується будь-якого автоматизованого методу безперервного захоплення вхідних і вихідних даних. Основною альтернативою є "знімки екрану" або різання та вставлення екрану в потрібний час під час сеансу (що я роблю для посібників користувача, приміток до журналу дня тощо).



2

я використав cat filename яка видаляє контрольні символи :-)


imo це краще відповісти, так як це дійсно видаляє все символи керування.
Nathanael Farley

на OSX, кішка не видаляє символи керування кольорами ...
Nick

9
Насправді кішка взагалі не видаляє контрольні символи, а виводить їх дословно, а термінал їх інтерпретує. Це може працювати для вас, якщо ваш текстовий текст короткий відносно вашого терміналу буфера і ви можете просто скопіювати і вставити з терміналу. Не дуже добре, якщо ваш машинопис великий.
mc0e

1
Домовлено. Це нічого не знімає. Це просто дозволяє оболонці інтерпретувати їх. Вони все ще присутні.
Kentgrav

2

Якщо після чого потрібно записувати ваші команди (наприклад, щоб пізніше перетворити їх на баш-скрипт), а потім запустити розумний хак script(1), потім всередині нього бігають

bash -x

Після цього grep вихідний файл (зазвичай "машинопис"), який шукає рядки, що починаються з "+". Регулярний вираз ^\+ буде робити трюк.


2

Якщо ви хочете написати вихідний файл у файл:

col -bp < typescript >>newfile

використовувати команду unix2dos для перетворення файлу у формат Windows, якщо хочете


1
На Ubuntu 14.04, що залишає у великій кількості сміття на початку і в кінці рядків. Досить читабельний, але не дуже чистий.
mc0e

2

col -bp обробляє зворотні проміжки за бажанням (AFAIK). Але він перетворює кольорові послідовності. Можливо, спочатку потрібно видалити послідовності кольорів, а потім, якщо можливо, обробити зворотні простори.

Це дуже поширена потреба, і я здивований, що до неї немає більше рішень. Дуже поширеним є сценарій сесії, тоді хтось потребує перегляду процедури. Ви хочете вирізати всі маленькі помилки набору тексту і кольорові послідовності, щоб створити "чистий" сценарій процедури для подальшого використання. Простий текст ASCII кращий. Я думаю, що це те, що призначено для "читабельного", і це дуже розумно.


1

Я знайшов Відповідь, яка надається на подібне питання на платі Unix, щоб бути більш ефективним у видаленні контрольних символів з виводу сценарію, якщо ви знаходитесь в середовищі, де доступний Perl.

сценарій dewtall:

#!/usr/bin/perl
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \r | # Remove extra carriage returns also
       (?:\e\[|\x9b) [ -?]* [@-~] | # CSI ... Cmd
       (?:\e\]|\x9d) .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       (?:\e[P^_]|[\x90\x9e\x9f]) .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e.|[\x80-\x9f] //xg;
       1 while s/[^\b][\b]//g;  # remove all non-backspace followed by backspace
    print;
}

Щоб видалити контрольні символи:

./dewtalls-script.pl < output-from-script-that-needs-control-characters-removed

1

https://github.com/RadixSeven/typescript2txt було написано для вирішення цієї проблеми.

Пройшло 4 роки з моменту останнього оновлення / використання, але я не пам'ятаю, що я робив щось таке, що не повинно працювати сьогодні.


0

Я знайшов хороший спосіб зробити це. У моїй системі довгі лінії виведення посипаються "^ M" (пробіл, за яким йде повернення каретки). "^ M" можна добре замінити нульовим символом "^ @", який не відображається взагалі, коли ви котять файл.

Я також захоплюю синхронізацію, тому для того, щоб відтворити файл відмінно, я не можу просто видалити "^ M" повністю за допомогою команд, наведених нижче (тому що скриптплейт розраховує байти):

tr '\r' '\0' | sed 's/ \x0//g'

Я виконую команду сценарію так:

script -t -f session.log 2>timing

Отже, те, що я роблю пізніше, це:

cat session.log | tr '\r' '\0' > typescript 
scriptreplay -t timing | sed 's/ \x0//g'

Перше редагування (до відтворення) зберігає кількість байтів у файлі. Друге редагування (після відтворення) позбавляє білого простору у випадкових місцях. (Зауважте, що за замовчуванням scriptreplay шукає вхідний файл з назвою "typecript", тому я не надав його після "timing".)


-1

dos2unix на виході також зробить свою справу


6
Не могли б ви пояснити, як його використовувати для виконання завдання?
Ben N

-2

Ще одне рішення - використовувати strings який друкує лише друковані символи з файлу (або зі стандартного вводу):

strings -n 1 filename

The -n 1 параметр встановлює мінімальну довжину послідовностей, які необхідно зберегти, і таким чином гарантує збереження навіть окремих символів для друку, оточених символами, які не друкуються.

Одним з можливих недоліків такого підходу є те strings додає розриви рядків між суміжними рядками друкованих символів. Наприклад, файл із вмістом

Foo<SOMECONTROLCHAR>Bar

(де <SOMECONTROLCHAR> є контрольним символом або будь-яким іншим недрукованим символом) буде повернуто як

Foo
Bar

Інша проблема, що виникає в коментарях, полягає в тому, що деякі послідовності контрольних символів складаються з комбінації як друкованих, так і недрукованих символів, і цей підхід видалив би лише частину цих символів.

Однак, strings робить хорошу роботу з видалення контрольних символів, таких як зворотний простір, зазначений у запиті.


strings не видаляє всі символи, які не підлягають друку. Вона ідентифікує і друкує послідовності друкованих символів . Це не те ж саме.
a CVn

@ MichaelKjörling, ти маєш рацію, за замовчуванням strings друкує лише послідовності мінімальної довжини 4. Я виправив відповідь, додавши -n 1 опція, яка встановлює мінімальну довжину до 1. Дякуємо, що вказали це.
justfortherec

Відповідь досі стверджує те ж саме strings видаляє всі символи, які не підлягають друку, тому все одно неправильно, так само, як і до редагування. Очевидно, це також порушено, оскільки "деякі кольорові коди" (і контрольні коди взагалі) часто складаються як з друкованих, так і з недрукованих символів. Наприклад, послідовність коду керування для зміни кольору тексту може бути ESC[01;52m де ESC є єдиним символом втечі (значення байта 27). Використання strings як ви пропонуєте залишити [01;52m у виході, що безглуздо.
a CVn

Хороший пункт, @ MichaelKjörling. Особливо приклад з кольоровим кодом був дуже невдалий. Дякуємо, що допомогли мені покращити свою відповідь. Чи правильно виправлення стосуються ваших проблем? strings може не виконувати ту ж саму роботу, що і деякі інші відповіді, але ІМХО це правильний підхід до вирішення проблеми, описаної в питанні.
justfortherec
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.