Как написать stdout в файл с цветами?

21

Много раз (не всегда) stdout отображается в цветах. Обычно я сохраняю каждый выходной журнал в другом файле. Естественно, в файле цвета больше не отображаются.

Я хотел бы знать, есть ли способ (в linux) записать вывод в файл с цветами. Я пытаюсь использовать tee для записи вывода брандмауэра в файл, таким образом, я все еще могу видеть результат (когда он применяется). Я хочу использовать его специально для бродяг (это может измениться в будущем, конечно ...)

Спасибо!     

задан AAlvz 10.12.2014 в 10:51
источник
  • Обычно программа, выполняющая запись, определяет, записывает ли она терминал, и если она не будет использовать цвета. Поэтому, вероятно, речь идет о том, чтобы использовать эту программу в любом случае. У некоторых программ есть что-то вроде --color всегда, но нет стандарта. –  Biffen 10.12.2014 в 10:54

4 ответа

19

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

script -q -c "vagrant up" filename.txt

Это будет записывать вывод из vagrant up в файл filename.txt (и терминал). Если эхо не желательно,

script -q -c "vagrant up" filename > /dev/null

будет записывать его только в файл.

    
ответ дан Wintermute 10.12.2014 в 11:54
  • Мне очень нравится этот ответ, и это самый лучший пока, но разве это не слишком переполнено? :) –  AAlvz 12.12.2014 в 17:39
  • скрипт на удивление легкий, на самом деле. В основном это просто открывает pty, порождает оболочку и передает вам результат. Это около 500 строк кода C, в целом. –  Wintermute 12.12.2014 в 18:18
  • Спасибо! Мне очень нравится это решение. Скрипт имеет большой потенциал! –  AAlvz 14.12.2014 в 19:33
  • Это не работает - по крайней мере, со сценарием из bsdutils 1: 2.25.2-6 на debian. «ls -l» дает цвет. «script -q -c 'ls -l'" - нет. –  Draemon 05.08.2016 в 03:31
  • Для Mac OSX: скрипт -q filename.txt запускает работу. использование: script [-adkpqr] [-t time] [файл [команда ...]] –  jezmck 19.06.2017 в 17:11
Показать остальные комментарии
9

Вы можете сохранить последовательности ANSI, которые окрашивают ваш вывод в файл:

echo a | grep --color=always . > colour.txt
cat colour.txt

Однако некоторые программы имеют тенденцию не использовать , если их вывод не идет на терминал (поэтому мне пришлось использовать --color-always с grep ).

    
ответ дан choroba 10.12.2014 в 10:55
  • вы знаете, есть ли способ сделать это с тройником? –  AAlvz 10.12.2014 в 16:42
  • @AAlvz: Что случилось, когда вы пробовали? echo a | grep --color = всегда. | tee colour.txt –  choroba 10.12.2014 в 16:47
  • Это всегда красный, независимо от того, что = / –  AAlvz 10.12.2014 в 16:56
  • @AAlvz: Конечно, так по умолчанию настроен grep. Я, хотя это был ваш вопрос: как получить цвет в файл. Если вы хотите знать, как обрабатывать результат, это другой вопрос. –  choroba 10.12.2014 в 17:00
  • @AAlvz: ну, выход grep в моем примере поставляется с цветами, и вы могли видеть те же цвета в выходном файле. Теперь вам просто нужно выяснить, есть ли опция для бродяг, похожая на --color = always, если она чувствительна к выходу терминала / файла. –  choroba 10.12.2014 в 17:07
6

Вы также можете покрасить свой вывод с помощью эха с разными цветами и сохранить цветной вывод в файле. Пример

echo -e '\E[37;44m'"Hello World" > my_file

Также вам нужно будет познакомиться с цветовыми кодами терминалов

Использование tee

< command line > |tee -a 'my_colour_file'

Откройте файл в cat

cat 'my_colour_file'

Использование именованного канала также может работать для перенаправления всего вывода из канала с цветами в другой файл

например

Создайте именованный канал

mkfifo pipe.fifo

каждая командная строка перенаправляет его на трубу следующим образом

<command line> > pipe.fifo

В другом терминале перенаправить все сообщения из канала в файл

cat pipe.fifo > 'my_log_file_with_colours'

откройте файл с кошкой и посмотрите ожидаемые результаты.

    
ответ дан repzero 10.12.2014 в 12:06
  • Проблема здесь в том, что выход Vagrant уже имеет цвета ... В настоящее время я использую tee для сохранения их в файл –  AAlvz 11.12.2014 в 13:57
  • хорошее наблюдение. Тем не менее, он по-прежнему демонстрирует принцип, что цветной выход можно сохранить. Ответ отредактирован, чтобы исправить эту мелочь. –  repzero 11.12.2014 в 21:54
  • Я также уверен, что это можно сделать ... Но я до сих пор не знаю, как это сделать. Если вы придете с идеей, скажите, пожалуйста. –  AAlvz 12.12.2014 в 11:14
  • Хорошо, я отредактировал свой ответ, чтобы продемонстрировать другой способ использования именованных каналов для перенаправления всех цветных выходных данных для каждой командной строки на именованный канал –  repzero 12.12.2014 в 12:10
  • Я был настолько уверен, что это сработает, но это не так: / (без цветов) –  AAlvz 12.12.2014 в 17:35
Показать остальные комментарии
0

Я узнал, что с помощью инструмента ansi2html.sh

Самый простой способ экспортировать красочные данные терминала в html-файл,

Команды для его использования:

ls --color=always | ansi2html.sh --palette=solarized > ~/Desktop/ls.html
  • Все нужно, чтобы отправить вывод с использованием канала, а затем вывести stdout в простой файл html
ответ дан Pini Cheyni 10.01.2018 в 16:21