[shell] "Разукрасить" вывод программы на консоль

Все о программировании под *nix
Dziman
Заглянувший
Сообщения: 11
Зарегистрирован: 28 сен 2006, 18:08
Откуда: Minsk, BY
Контактная информация:

[shell] "Разукрасить" вывод программы на консоль

Сообщение Dziman »

Хочется странного :) : есть некая программа, которая выводит кучу всего на консоль построчно. Хотелось бы "разукрасить" этот вывод: например, если в строке есть слово error, то все строка красным и т.п. И еще хотелось чтобы это все происходило в "реальном" времени, т.е. раскрашивалось и выводилось на консоль по мере работы программы.
Возможно ли такое(нутром чую что возможно :) ) ? И как :) ?
ЗЫ. С shell-scripting знаком поверхностно :( но учиться не прочь :)
Не говорите что мне делать и я не скажу куда вам идти.

Аватара пользователя
myst
Маньяк
Сообщения: 190
Зарегистрирован: 04 окт 2005, 15:46
Откуда: не возвращаются

Сообщение myst »

Почитай про ANSI terminal, sed и | (pipe).
Иными вечерами я пью, чтобы кого-нибудь не пристрелить. Это акт благотворительности. Не за что.

Аватара пользователя
Victor Gr.
Неотъемлемая часть форума
Сообщения: 891
Зарегистрирован: 13 авг 2004, 15:39
Откуда: Минск
Контактная информация:

Сообщение Victor Gr. »


olecom
Интересующийся
Сообщения: 65
Зарегистрирован: 03 апр 2008, 18:54
Откуда: Родом: Чернавчицы, Брест, Бульбастан; Сейчас: Оломоуц, Чехия.

цветовой вывод на терминал

Сообщение olecom »

Dziman, ничего тут странного нет, обычный полёт фантазии, чего многим не хватает или не дано!

Надеюсь "консоль" работает на vt10X совместимом терминальном эмуляторе (все программные в Linux, включая putty в Windows). До написания скрипта необходимо понимать как работает вывод, вчастности на терминал. Программа будь-то `cat` или `mc` по своей сути просто выводит символы на то, что им предоставляется запускаемым процессом как stdout,

Код: Выделить всё

write(STDOUT_FILENO, buf, count);
где STDOUT_FILENO = 1 (обычно).

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

man console_codes, http://kerneltrap.org/man/linux/man4/console_codes.4 содержит достаточно информации для того, чтобы узнать что каждый символ выполняет. Для простоты надо разделить символьный поток на

* управляющие символы
* управляющие последовательности символов
* обычные симвлы

типичные фунции:

+ перевод курсора на новую строку, перевод его в начало строки и пр
+ escape последовательности, указание атрибутов символов и пр
+ все, что не являются управляющими и не входят в состав последовательности.

Терминальный вывод -- это очень кривое наследие, с которым приходится считатся. Но почему-то это наследие не имеет в себе ничего подобного на Turbo Vision look and feel. Причин можно назвать много, но основная, это война как аппаратных терминалов, так и UNIX на чисто коммерческой основе. С программной точки зрения, универсальность посимвольной работы и её простота, позволяют реализовывать теперь уже эмуляторы терминалов очень просто, учитывя что фунционал очень примитивный. Все символы идущие в stdout/stderr попадая в терминал выполняют свои функции, но попадая в перенаправленный файл или pipe, они просто пугают. И это одна из кривостей (for tty в скрипте предусмотрено для этого случая).

(Ещё немного потерпеть прежде чем начнётся скриптинг.)

Проработав в текстовой консоли достаточно времени, я просто поразился тому, как идеи терминального вывода застыли в 70х. Для меня кажется тривиальным иметь современное окно вывода разделённое на части в которых видны отдельно stdout, stderr. Этого легко достичь программно, но это также очень легко и без костылей можно было делать в эмуляторах терминалов. Кроме этого каждый вывод можно было делать в свой кусок памяти видео адаптера(64/128 мегов рамы просто так греют комнату http://hedera.linuxnews.pl/_news/2002/0 ... /1445.html ), который бы управлялся как окно, то есть скроллинг, изменение размеров и положения (помимо всего прочего).

О чём тут говорить, если главный разработчик основной библиотеки glibc, с радостью сообщает читателям своего блога, что он таки использует цветной `grep` http://udrepper.livejournal.com/17109.html , а разработчики ядра линукс до сих пор охотятся за сообщениями stderr скролируя однообразный суп выводимый системой сборки?

Приступим. Цвета и атрибуты, естественно по вкусу.

Код: Выделить всё

#!/bin/sh

color() {
    # $1 -- regex
    # $2 -- color code
    # $3 -- next color code
    printf %s "`eval echo $TERMINAL_OUTPUT`"
}

# for tty
[ -t 1 ] && {
  # escape symbol
  E=`printf '\x1B'`
  # default rendering
  D="$E[0m"
  # attributes for filtered stuff (reset bg color and bold, set fg color)
  V="$E[40;22;3"
  TERMINAL_OUTPUT='s-"$1"-"$V$2m&$V${3-0}m"-;'
}

exec sed "
`color '[^:]*' 4 3`
`color :       3 2`
`color AMD     6 2`
`color Intel   6 2`
`color Athlon  '6;44' 2`
`color Pentium '6;44' 2`
"

Код: Выделить всё

$ sh colorize.sh </proc/cpuinfo
Скачать: ftp://flower.upol.cz/crazy/colorize.sh

Что-то такое придумалось. Каждый `color` это, можно сказать, цветной `grep`. Где-то ещё я делал подсветку скриптов (нетривиально) и вывода типа как у `stat`, но это нужно поискать.

Для игр более сложных в плане разрисовки, надо уже более детальное знание `sed` и basic regular expressions (man regex). Для понимания скрипта, надо немного посидеть, как моя школьная математица говорила: "покрутить".

Я как-то хотел было сделать свою систему окон вдобавок к обычным терминалам и свою примочку к редактору с качественной подстветкой синтаксиса у regex. За много десятилетий UNIX и Emacs ни у первых ни у eLISP-вторых таких достижений я не вижу. И как мне кажется отсуствие подсветки в таких базовых вещах говорит только о том, как всё плохо в "современных компьютерных технологиях".

Так что если есть желание работать вместе, милости прошу.
Последний раз редактировалось olecom 09 апр 2008, 12:36, всего редактировалось 2 раза.

olecom
Интересующийся
Сообщения: 65
Зарегистрирован: 03 апр 2008, 18:54
Откуда: Родом: Чернавчицы, Брест, Бульбастан; Сейчас: Оломоуц, Чехия.

продвинутая подстветка без костылей

Сообщение olecom »

Как отсупление от темы в свою сторону, хочу сказать о том, что пришло в голову на счёт всех этих подсветок. Важность их трудно переоценить. Так один знакомый олимпиадник по информатике в школе рассказывал о том, как он фанател после перехода с Borland Pascal 5 на 6/7, где была уже подсветка, и кучи синтаксических и прочих ошибок запросто всплывали на экране. Однообразие напрягает. В отличие от книжки, программируя необходимо сильно думать (те крутые лиспокодеры думают ещё и про скобки).

Не надо ничего изобретать в плане нечитабельных regex и прочих костылей. Сам парсер, будь-то `sh`, `sed`, `gcc` или луюбой другой (да XML!), должен иметь интерфейс к выводу подсвеченного кода. Что как не сам парсер знает все детали своего синтаксиса?

Похоже в 70х для этого не было достаточно производительности, денег, сил или фантазии программистов. Но вот уже более десятка лет процессоры в консоли только отдыхают, ожидая бесконечные микросекунды между нажатиями клавишь пользователя...
Последний раз редактировалось olecom 07 апр 2008, 23:39, всего редактировалось 2 раза.

olecom
Интересующийся
Сообщения: 65
Зарегистрирован: 03 апр 2008, 18:54
Откуда: Родом: Чернавчицы, Брест, Бульбастан; Сейчас: Оломоуц, Чехия.

про олимпиады

Сообщение olecom »

Вспоминая про олимпиадников.

http://dl2.gsu.by/olymp/

Тренируют мышцы чтоб потом сравнивать у кого больше? Вообще кто сказал, что те задачи -- это круто, даже если они сложные? Неужели "автоматическая" система конторля так забавляет живых и одарённых программистов/информатиков? Куда все эти дети деваются? Жизнь, не спорт? Преподавателям не жалко тратить время на придумывание очередных запутынных зОдач со схематическим, но запутанным решением?

Уважаемые преподаватели или близкие к ним, разуйте глаза и покажите свои расчётки, признайтейтес в неэффективности и инертности ваших образовательных решений. Перестаньте уродовать детей!

olecom
Интересующийся
Сообщения: 65
Зарегистрирован: 03 апр 2008, 18:54
Откуда: Родом: Чернавчицы, Брест, Бульбастан; Сейчас: Оломоуц, Чехия.

Re: про олимпиады

Сообщение olecom »

olecom писал(а):Вспоминая про олимпиадников.
Хотелось бы это вынести в отдельную тему или статью, конечно.

Эффект суперпрограммиста понятно и по русски:
http://www.compitech.ru/html.cgi/arhiv/ ... at_130.htm

Аватара пользователя
myst
Маньяк
Сообщения: 190
Зарегистрирован: 04 окт 2005, 15:46
Откуда: не возвращаются

Re: продвинутая подстветка без костылей

Сообщение myst »

olecom писал(а):Похоже в 70х для этого не было достаточно производительности, денег, сил или фантазии программистов. Но вот уже более десятка лет процессоры в консоли только отдыхают, ожидая бесконечные микросекунды между нажатиями клавишь пользователя...
Да вы, товарищ, оказывается попросту некомпетентны и воду в ступе потолочь любите. Вот вам картинка, где видно, почему в 70-х цветной вывод был не нужен. А в 80-х, на всякий случай вам скажу, 90% дисплеев были чёрно-белые, соответственно, о каком цвете могла идти речь?
Иными вечерами я пью, чтобы кого-нибудь не пристрелить. Это акт благотворительности. Не за что.

botsman
Интересующийся
Сообщения: 66
Зарегистрирован: 12 июн 2007, 14:33
Откуда: Оршанский район

Re: продвинутая подстветка без костылей

Сообщение botsman »

myst писал(а):
olecom писал(а):Похоже в 70х для этого не было достаточно производительности, денег, сил или фантазии программистов. Но вот уже более десятка лет процессоры в консоли только отдыхают, ожидая бесконечные микросекунды между нажатиями клавишь пользователя...
Да вы, товарищ, оказывается попросту некомпетентны и воду в ступе потолочь любите. Вот вам картинка, где видно, почему в 70-х цветной вывод был не нужен. А в 80-х, на всякий случай вам скажу, 90% дисплеев были чёрно-белые, соответственно, о каком цвете могла идти речь?
Дико извиняюсь - не "черно-белые", а "монохромные".... :wink:
Ubuntu 11.10:
Laptop - Acer Aspire 5738ZG
Desktop - Intel Core i5-2300 2.8GGz, RAM 8 GB, MB - MSI PH67A-C45, Video nVidia GeForce 560

olecom
Интересующийся
Сообщения: 65
Зарегистрирован: 03 апр 2008, 18:54
Откуда: Родом: Чернавчицы, Брест, Бульбастан; Сейчас: Оломоуц, Чехия.

Re: продвинутая подстветка без костылей

Сообщение olecom »

myst писал(а):
olecom писал(а):Похоже в 70х для этого не было достаточно производительности, денег, сил или фантазии программистов. Но вот уже более десятка лет процессоры в консоли только отдыхают, ожидая бесконечные микросекунды между нажатиями клавишь пользователя...
Да вы, товарищ, оказывается попросту некомпетентны и воду в ступе потолочь любите. Вот вам картинка, где видно, почему в 70-х цветной вывод был не нужен. А в 80-х, на всякий случай вам скажу, 90% дисплеев были чёрно-белые, соответственно, о каком цвете могла идти речь?
ЭЭх, молодёжь... Вам бы только оскорблять.

(не в тему текстового режима, а ответ на невежество и хамство)

http://en.wikipedia.org/wiki/Xerox_Alto

можно придратся:
"the Alto's only common output device was a bi-level (black and white) CRT display"

Цветастые трубки -- это пятидесятые. А деньги на них двадцать лет спустя у исследователей, супер-программеров, а не коммерческих структур, могли найтись.
http://en.wikipedia.org/wiki/CT-100

Однако что бы вы, myst, сказали на счёт пормежутка 90х? (вопрос риторический, отвечать не надо)

Где тут включается список игнорирования?
_____

Аватара пользователя
myst
Маньяк
Сообщения: 190
Зарегистрирован: 04 окт 2005, 15:46
Откуда: не возвращаются

Сообщение myst »

В контексте UNIX, PARC и иже с ними не находятся, поэтому ссылаться на них бессмысленно.

Что касается денег, то Bell Labs. (мы всё ещё про UNIX, вы не забыли?) это вам не MIT и не ARPA, они и на PDP-11/20 еле наскребли.

А в 90-х всё как раз и поцветнело. То, что должно было поцветнеть. Это вопрос из разряда "Почему нет FAR под UNIX. Потому что те, кому он нужен, не могут его написать, а тем, кто может написать, он не нужен." Аналогично и цветной вывод. Кстати, патчи всё-равно приветствуются.
Иными вечерами я пью, чтобы кого-нибудь не пристрелить. Это акт благотворительности. Не за что.

Аватара пользователя
mend0za
Неотъемлемая часть форума
Сообщения: 2332
Зарегистрирован: 30 авг 2002, 12:33
Откуда: Minsk

Сообщение mend0za »

Как счастливый обладатель компьютерного класса на терминалах ICL VT420 (1993 г.в.) - могу только подтвердить слова тов. myst - B&W.

Кафедра ЭВМ и HP Apollo (архитектура motorolla3) - чёрно-зелёное.
Оба конец восьмидесятых - начало девяностых.

VT420: black & white и парочку полутонов на их комбинировании (1-2). 80x25, 80x30, 80x50 и т.д. IMHO цвет существенно увеличивал бы стоимость этих устройств.

В противоположность им - Sillicon Graphics Indy (1993 г.в.) - штатный 20' цветной монитор. Стоимость - фантастическая. Распространённость - только в очень специализированных конторах (видеообработка, CAD, графика).

Цвет долгое время был прерогативой дорогостоящих рабочих станций. Прорыв PC с его графическими режимами только подчеркнул, насколько велик был разрыв между доступными (читай чернобелыми текстовыми) и элитарными (читай цветными графическими) решениями.
И увидел я зверя, выходящего из тундры. И число его было 3.14159265358979324...

olecom
Интересующийся
Сообщения: 65
Зарегистрирован: 03 апр 2008, 18:54
Откуда: Родом: Чернавчицы, Брест, Бульбастан; Сейчас: Оломоуц, Чехия.

Цветной-текстовый

Сообщение olecom »

Да... Где были мы, а где они?..
mend0za писал(а):Цвет долгое время был прерогативой дорогостоящих рабочих станций.
* 92-93й брестский областной институт повышения квалификации школьных учителей: цветные VGA/SVGA (плоские ходилки и Цивилизация!), монохромные белые и зелёные, двойки и тройки.

* 94й деревня Чернавчицы. Двойка и SVGA 14" у препода, который "Spear of Destiny" гонял,
(цветные) корветы, спектрумы и прочие приставки уже не редкость.

Об общей инерционности образования где-то уже было.

В плане программирования всё стало равным до того, что можно посмотреть и порассуждать о "прогрессе". 90-е -- чип и инет прогресс, так как interactive TV с телетекстом криво выходило в никуда. Это бабло хлынуло в дот комы, но кабеля много еды не просят. А open source ещё а 80х был open source, теперь только распределённый.
mend0za писал(а):Прорыв PC с его графическими режимами только подчеркнул, насколько велик был разрыв между доступными (читай чернобелыми текстовыми) и элитарными (читай цветными графическими) решениями.
Цветной-текстовый? Собственно о чём и речь.
_____

olecom
Интересующийся
Сообщения: 65
Зарегистрирован: 03 апр 2008, 18:54
Откуда: Родом: Чернавчицы, Брест, Бульбастан; Сейчас: Оломоуц, Чехия.

разукрасим интерактивно сборку вЯдра

Сообщение olecom »

Да, что-то народ как-то не так...

Разукрашивание -- дети этим любят заниматся, а им бесконечные задачки про непонятно что (почитал здесь про 8й класс). Дети вообще рулят, тока отупевшим взрослым (включая большинство голодных преподов) этого не понять... Итак, назад в детство!

Сделаем разукрашивание "в реальном времени", хотя термин и не подходящий. real time -- это про интустриальное управление.

Более подходит "интерактивный". Interaction -- взаимодействие, по-этому надо чтобы фломастеры взаимодействовали с выводом программ. В вакууме они бесполезны.

Может сборка топикового вЯдра расшевелит аудиторию? Скрипт можно взять и прикрутить в kbuild, запостить в LKML. Девелоперы будут рады, они бедняги всё хотят вЯдро.

Playing with printk() By Jonathan Corbet October 9, 2007
http://lwn.net/Articles/253726/

О! Тут меня цитировали. Только вЯдерный даунизм ещё больше крепчал.

Посмотрев на это, может кто из пых-пыхокодеров прикрутит GNU highlight сюда или что-то такое?

Код: Выделить всё

#!/bin/sh
# colorize linux build; coding: koi8-r

# Time-stamp: Wed Apr  9 13:78:13 CEST 2008 olecom@flower.upol.cRAzY

color() {
    # $1 -- regex
    # $2 -- color code
    # $3 -- next color code (default is $D)
    # $4 -- regex match number
    printf %s "`eval echo $TERMINAL_OUTPUT`"
}

# for tty
[ -t 1 ] && {
    # escape symbol
    E=`printf '\033'`
    # default fg && bg rendering ; reset attributes
    D="7" ; RESET="$E[0m"
    # basic attributes (reset bg color and bold, set fg color)
    V="$E[40;22;3"
    # wrap regex with color ; goto exit
    TERMINAL_OUTPUT='{s-"$1"-"$V$2m&$V${3-'$D'}m"-$4 ";" b}'
}

# process stdout

[ -z "$COLORIZERR" ] && {
    sed "
/CC/` color CC '6;1'`
/LD/` color LD '2;1'`
/AS/` color AS '5;1'`
/GEN/`color GEN '2;1'`
/UPD/`color UPD '2;1'`
/CHK/`color CHK '3;1'`
/CA/` color CALL '6'`
s-^-${V}2m-
"
    printf "$RESET
"
    exit
}

# process stderr (once)

while read ERROR
do OUT=$OUT'
'$ERROR
done

printf "\033[1;37;41m$OUT$RESET
"
exit

# usage

olecom@flower:/tmp/blinux$ stty -tostop
olecom@flower:/tmp/blinux$ mkfifo /tmp/colorize-out.pipe /tmp/colorize-err.pipe
olecom@flower:/tmp/blinux$ sh /tmp/colorize.sh </tmp/colorize-out.pipe &
[1] 28138
olecom@flower:/tmp/blinux$ COLORIZERR=yes sh /tmp/colorize.sh </tmp/colorize-err.pipe &
[2] 28145
olecom@flower:/tmp/blinux$
olecom@flower:/tmp/blinux$ make >/tmp/colorize-out.pipe 2>/tmp/colorize-err.pipe
make -C /mnt/zdev0/linux-2.6 O=/dev/shm/blinux/.
  Using /mnt/zdev0/linux-2.6 as source for kernel
  GEN     /dev/shm/blinux/Makefile
  CHK     include/linux/version.h
  CHK     include/linux/utsrelease.h
  CALL    /mnt/zdev0/linux-2.6/scripts/checksyscalls.sh
  CHK     include/linux/compile.h
  CC      arch/x86/mm/init_64.o
  CC      arch/x86/mm/fault.o
  CC      arch/x86/mm/ioremap.o

olecom@flower:/tmp/blinux$
make[3]: *** wait: No child processes.  Останов.
make[3]: *** Ожидание завершения заданий...
make[3]: *** wait: No child processes.  Останов.
make[2]: *** [arch/x86/mm] Ошибка 2
make[1]: *** [sub-make] Interrupt
make: *** [all] Interrupt

[1]-  Done                    sh /tmp/colorize.sh </tmp/colorize-out.pipe
[2]+  Done                    COLORIZERR=yes sh /tmp/colorize.sh </tmp/colorize-err.pipe
olecom@flower:/tmp/blinux$

# end
Скачать: ftp://flower.upol.cz/crazy/colorize-linux-build.sh

Как из этого сделать демон, разделить консоль на две stdout, stderr области, можно дать как домашнее задание.
Последний раз редактировалось olecom 11 апр 2008, 14:58, всего редактировалось 4 раза.

olecom
Интересующийся
Сообщения: 65
Зарегистрирован: 03 апр 2008, 18:54
Откуда: Родом: Чернавчицы, Брест, Бульбастан; Сейчас: Оломоуц, Чехия.

ограничеснность цветовой палитры

Сообщение olecom »

Если кто запустит и захочет дальше что разукрашивать, тут-то и нарисуются рога про ограниченность цветовой палитры терминалов.

Хотя может какой там крутой rxvt прикрутил дополнительные последовательности для большего числа цветов. Никто не в курсе? Зоопарк эмуляторов, может где есть толк от них?

Ответить