Удаление символов управления (включая консоль кодирует / цвета) из произведенного сценария

Я использую Связку ключей для управления ssh ключи. Это также доступно в Debian и поэтому по-видимому, Ubuntu с

apt-get install keychain

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

70
09.06.2011, 23:45
14 ответов

Следующий сценарий должен отфильтровать все ANSI/VT100/xterm управляющие последовательности для (на основе ctlseqs). Минимально протестированный, сообщите о любом под - или примите меры.

#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       \e\[ [ -?]* [@-~] | # CSI ... Cmd
       \e\] .*? (?:\e\\|[\a\x9c]) | # OSC ... (ST|BEL)
       \e[P^_] .*? (?:\e\\|\x9c) | # (DCS|PM|APC) ... ST
       \e. //xg;
    print;
}

Известные проблемы:

  • Не жалуется на уродливые последовательности. Это не то, для чего этот сценарий.
  • Многострочные аргументы строки к DCS/PM/APC/OSC не поддерживаются.
  • Байты в диапазоне 128–159 могут быть проанализированы как управляющие символы, хотя это редко используется. Вот версия, которая анализирует управляющие символы неASCII (это исказит текст не в формате ASCII в некоторой кодировке включая UTF-8).
#!/usr/bin/env perl
## uncolor — remove terminal escape sequences such as color changes
while (<>) {
    s/ \e[ #%()*+\-.\/]. |
       (?:\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;
    print;
}
57
27.01.2020, 19:31
  • 1
    благодаря обоим ответам. я чувствовал, что должен сделать что-то как хороший ответ, хотя оба дают regexps, которого я хотел избежать. выбрал этого, поскольку это дает ссылку для формата. –  andrew cooke 16.06.2011, 15:49
  • 2
    @andrew: Мой regexp достаточно гибок, что я ожидаю, что это будет работать с в значительной степени любым теперь существующим терминалом, и вероятно с любым завтра существующим терминалом также. Я не протестировал его очень, таким образом, могли бы быть ошибки, но подход является звуковым, поскольку управляющие последовательности следуют за несколькими общими шаблонами. –  Gilles 'SO- stop being evil' 16.06.2011, 16:53
  • 3
    обеспечьте, как использовать этот сценарий. это требует, чтобы канал ввел? или позиционные параметры? –  Trevor Boyd Smith 05.01.2018, 19:14
  • 4
    @TrevorBoydSmith, Любой будет работать на вход, и вывод всегда находится на стандартном выводе, как типичные текстовые утилиты. –  Gilles 'SO- stop being evil' 05.01.2018, 22:31

Я использовал бы sed в этом случае.

сделайте:

cat -v typescript | sed -e "s/\x1b\[.\{1,5\}m//g"

sed-e "s/search/replace/g" является стандартным материалом. regex объяснен как указано ниже:

\x1b соответствуйте Escape, предшествующему цветовому коду \[ соответствует первой открытой скобке .\{1,5\} соответствия 1 - 5 из любого отдельного символа. Имейте к \ фигурные скобки, чтобы помешать оболочке искажать их. m последний знак в regex - обычно запаздывает цветовой код. // пустая строка для того, что заменить все. g соответствуйте ему многократно на строку.

10
27.01.2020, 19:31
  • 1
    Этот regex разделяет слишком много (foo\e[1m(1m = { становится foo = { вместо foo(m = {), замена . [0-9;] более точно. –  Lekensteyn 30.12.2013, 17:14
  • 2
    Замена .\{1,5\} с [^m]\{1,5\} для этого - но также и примечание, что это даже затем все еще только удаляет "графическое представление" коды (те, которые заканчиваются в m) - в основном цвет, обратный, полужирный и стили курсива (где применимый). –  Hannu 23.08.2015, 17:26
  • 3
    Это не удаляет \x1b(B (включенный в подвергает вывод цвета коррозии), –  ideasman42 11.11.2016, 15:11
  • 4
    Почему это \x1b и нет \033? –  atripes 24.08.2017, 18:21

Обновление ответа Жабр, чтобы также удалить возвраты каретки и сделать стирание клавиши Backspace предыдущих символов, которые были оба важны для меня для машинописного текста, сгенерированного на Cygwin:

#!/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;
}
31
27.01.2020, 19:31
  • 1
    +1 я уже вводил сообщение с тем же вопросом как OP, когда я любящий это сообщение с Вашим сценарием и тем из @Gilles. +1 для вас обоих –  miracle173 30.04.2012, 01:02
cat typescript | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > typescript-processed
9
27.01.2020, 19:31
# The "sed -r" trick does not work on every Linux, I still dunno why:
DECOLORIZE='eval sed "s,${END}\[[0-9;]*[m|K],,g"'

=> как использовать:

<commands that type colored output> | ${DECOLORIZE}

проверено на: - AIX 5.x / 6.1 / 7.1 - Linux Mandrake / Mandriva / SLES / Fedora. - SunOS

6
27.01.2020, 19:31

Я решил проблему с помощью Scriptreplay на экране и сброс буфера прокрутки в файл.

Следующее ожидаемое сценарий делает это для вас.

Было протестировано на логики до 250 000 строк. В рабочем каталоге вам нужен ваш ScriptLog, файл под названием «Время» с 10.000.000 раз в строке «1 10» в нем и скрипте. Мне нужна имя вашего сценария в качестве аргумента командной строки, как ./ Имя_of_script name_of_scriptlog .

#!/usr/bin/expect -f 

set logfile [lindex $argv 0]

if {$logfile == ""} {puts "Usage: ./script_to_readable.exp \$logfile."; exit}

set timestamp [clock format [clock sec] -format %Y-%m-%d,%H:%M:%S]
set pwd [exec pwd]
if {! [file exists ${pwd}/time]} {puts "ERROR: time file not found.\nYou need a file named time with 10.000.000 times the line \"1 10\" in the working directory for this script to work. Please provide it."; exit}
set wc [exec cat ${pwd}/$logfile | wc -l]
set height [ expr "$wc" + "100" ]
system cp $logfile ${logfile}.tmp
system echo $timestamp >> ${logfile}.tmp
set timeout -1
spawn screen -h $height -S $timestamp 
send "scriptreplay -t time -s ${logfile}.tmp 100000 2>/dev/null\r"
expect ${timestamp} 
send "\x01:hardcopy -h readablelog.${timestamp}\r"

send "exit\r"

system sed '/^$/d' readablelog.$timestamp >> readablelog2.$timestamp
system head -n-2 readablelog2.$timestamp >> ${logfile}.readable.$timestamp
system rm -f readablelog.$timestamp readablelog2.$timestamp ${logfile}.tmp

Временный файл может быть сгенерирован

for i in $(seq 1 10000000); do echo "1 10" >> time; done
3
27.01.2020, 19:31

tr - переводить или удалять символы

cat typescript | tr -d [[:cntrl:]]
-4
20.08.2021, 13:35

Продолжая последний ответ, который использует tr и :cntrl :, можем ли мы сделать

sed "/^[[:cntrl:]]/d" output.txt

Мне кажется, это работает, потому что все строки, сгенерированные vi, начинаются с управляющего символа. Бывает также удаление пустых строк и строк, начинающихся с табуляции, хотя это работает для того, что я делаю. Возможно, есть способ сопоставить любой управляющий символ, кроме \n \m \t.

Может быть, мы можем найти конкретный управляющий символ, и похоже, что все ненужные строки, сгенерированные vi, начинаются с чего-то похожего на ^[. hexdump говорит мне, что первый символ — 1b, так что это тоже работает

sed "/^\x1b/d" output.txt

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

-2
20.08.2021, 13:35

Я обнаружил, что для просмотра вывода scriptв терминале достаточно просто использовать cat. Это не помогает при перенаправлении вывода в другой файл, но делает результат читабельным, в отличие от cat -v, col -bили текстового редактора.

Чтобы удалить цвета или сохранить результаты в файл, вручную скопируйте и вставьте вывод из catв текстовый редактор или в другую команду cat, например:

cat > endResult << END
<paste_copied_text_here>
END
1
20.08.2021, 13:35

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

$ cat typescript | ansi2txt | col -bp > typescript.txt.bp    
$ cat -v typescript.txt.bp

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

Я проверил это на последней дискотеке Ubuntu, и это работает.

1
20.08.2021, 13:35

Я использую

env TERM=dumb SHELL=/bin/bash script

оставляет вам машинописный файл с кучей ^M, но я просто удаляю эти

  • сvi

    :1,$s/^M//g
    

    не забывая сбежать из ^Mс помощью^V

  • или просто используйте

    dos2unix typescript
    
0
20.08.2021, 13:35

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

less -r session.log
1
20.08.2021, 13:35

В Ubuntu есть командаansi2txtв пакете colorized-logs. Он хорошо удаляет цветовые коды ANSI, но не имеет дело с такими вещами, как индикаторы выполнения, создаваемые путем испускания символов ^Hили ^Mдля перезаписи текста на месте. col -bможет работать с теми , поэтому для достижения наилучших результатов вы можете комбинировать два

cat typescript | ansi2txt | col -b
14
20.08.2021, 13:35

Я использую

cat file | ansifilter

См. https://gitlab.com/saalen/ansifilter.

1
20.08.2021, 13:35

Теги

Похожие вопросы