Применение символов Escape в перенаправленном выходе

Я запускаю программу, которая печатает много символов escape (например, «Esc [1A», чтобы переместить курсор вверх на одну строку) и пытается перенаправить вывод в файл журнала. Когда я запускаю программу без перенаправления, окончательный вывод выглядит примерно так:

256 lines processed. 

Но когда я перенаправляюсь к файлу журнала, это то, что файл выглядит так:

 Processing line 1... Esc[1AProcessing line 2... Esc[1AProcessing line 3... ... Esc[1AProcessing line 256... Esc[1A256 lines processed. 

Что происходит в терминале, символ «Esc [1A» говорит курсору для резервного копирования, так что каждая последующая строка перезаписывает последнюю строку, а в конце отображается только последняя строка.

Я хочу, чтобы файл журнала отображался точно так же, как конечный вывод программы появлялся без перенаправления. Я знаю, что можно col -bp вывод в col -bp , чтобы отфильтровать escape-символы, но я бы хотел применить их, чтобы мои файлы журналов не содержали тысячи посторонних строк. Как я могу это достичь?

  • Чтение дескрипторов файлов
  • Добавление содержимого в файл дает отказ в разрешении
  • Как захватить вывод mplayer в файл?
  • Что такое `& gt; &` в простых терминах?
  • Как определить, является ли вход из аргумента, файла или терминала
  • Почему можно ссылаться на закрытый stderr под bash?
  • Как я могу передавать данные в программу, которая ожидает чтения данных из файла, который указан в качестве аргумента?
  • Могу ли я имитировать утилиту tee, используя дополнительные файловые дескрипторы?
  • One Solution collect form web for “Применение символов Escape в перенаправленном выходе”

    Вам нужно очистить эти экраны, когда вы их читаете, – делайте то, что делает терминал, и перезаписывайте их.

    Это эмулирует вывод, который вы описываете w / seq :

     seq -s " $(printf '\033[A')" 10 

    Если он выписывает терминал, который интерпретирует этот выход, он будет печатать только 10 . Но, как вы заметили в вопросе, это действительно печатает все эти числа друг над другом. Однако, если я фильтрую его вывод с sed как:

     seq -s " $(printf '\033[A')" 10 | sed -e :n -e "\$!N;s/.*$(printf '\033\[A')//;tn" 

    … он действительно печатает только 10 потому что sed постоянно читает в каждой следующей строке ввода и s/// убирает все, начиная от головы пространства шаблонов и заканчивая последней победой ключа . И каждый раз, когда он делает это успешно, он снова возвращается к метке :n .

    Interesting Posts

    Ограничьте Alt + Tab текущим монитором в Gnome 3

    Интерфейс моста через виртуальные машины, чтобы обеспечить доступ к Интернету LAN

    Что означает :: 1 в Exim mainlog в rip и lip в журнале?

    Получение ширины консоли с помощью сценария bash

    путь сохранения в Debian

    что подразумевается под подключением STDOUT и STDIN?

    Попытка прочитать USB Audio Device, но / dev / hidraw0 недоступен для чтения

    Почему minecraft намного более темный на моей стороне Linux, чем на моей стороне Windows?

    Как я могу проверить, запущен ли мой cronjob на моем сервере через PHP?

    Как разбить образ диска ddrescue и как его использовать?

    Использовать ли только программный рендеринг программного обеспечения intel gpu (Mesa)?

    Ошибочный вывод видео из mvp с использованием аппаратного декодирования VAAPI

    Сохранение каждого выхода в переменную

    Невозможно подключиться к любому подключению localhost

    Ноутбук Dell перегревается и выключается

    Linux и Unix - лучшая ОС в мире.