Разукрашиваем вывод mysql-client в консоли

Цвет и звук — это те небольшие радости, которые могут разукрасить и облегчить будние администратора при постоянной работе с консолью. Вывод цветовой информации регулируется так называемым escape-последовательностями, определяющими среди прочего цвет текста и цвет фона.

Общий вид: \033[Xm, где X — это значение параметра (цифра). Например, echo -ne "\033[34mHELLO" выведет синим цветом «HELLO». Таблицу цветов и других доступных параметров (подчеркивание, мигание и т.п.) можно получить в документации man console_codes в разделе «ECMA-48 Set Graphics Rendition». Обычно поддержка цвета интегрирована в само приложение, но mysql-client не входит в число таких программ.

В интернете не раз был встречен вопрос о разукрашивании консоли mysql, но нигде не нашлось рецепта. Только общие слова «может быть состряпать обертку» или «посмотрите в исходном коде». Такой вопрос на StackOverflow жил без ответа более 2 лет! «Жил» было специально употреблено в прошедшем времени, потому что ответ нашелся.

Поможет нам утилита grc. Она доступна в большинстве дистрибутивов и о ней многие знают. Но как обернуть в нее вывод mysql-client?



Утилита grc (Generic Colorizer) — это на самом деле обертка для grcat, которая запускает указанную команду и направляет вывод в grcat согласно конфигу. Нам понадобится непосредственно grcat, для которой будет написан конфиг, а так же небольшая настройка mysql-client.

В чем же проблема просто направить вывод mysql-client в grcat? Или просто использовать grc mysql…? В том, что mysql-client распознает окружение, из которого вызывалась команда. Если она используется интерактивно, то отображается табличная разметка. Если вызов был из скрипта, или поток данных направлен в другую программу — убирает табличную разметку из вывода и использует табуляцию. Простой пример:

$ mysql test -e "select * from test_table"
+----+-------+
| id | value |
+----+-------+
| 1  | a     |
+----+-------+


$ mysql temp -e "select * from test_table" | cat - 
id  value
1   a


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

Как подсказал пользователь truezemez в комментарии, табличный вывод можно сохранить с помощью опции --table. В этом случае перенаправление вывода в grc так же будет работать.

И на помощь приходит черный плащ чтение документации mysql. Оказывается, в mysql-client можно задать параметр PAGER, который отвечает за вывод результатов на экран. Им-то мы и воспользуемся, прописав туда grcat. Не забываем указать файл с конфигурацией. Вот фрагмент файла ~/.my.cnf:

[mysql]
pager  = grcat ~/.grcat


Не обязательно задавать PAGER в конфиге, можно каждый раз вводить его руками, но это уже на любителя

mysql> pager grcat ~/.grcat
PAGER set to 'grcat ~/.grcat'


Все, что нам осталось сделать — это оформить конфиг для grcat, чтобы он распознавал таблицы mysql при выводе и применял к ним цветовую схему. Выше мы указали, что искать его следует по пути ~/.grcat. Конфиг состоит из групп параметров, обязательными являются regexp и colours. Параметры разделяются минусом, а решетка — это комментарии. Утилита проверяет совпадение регулярного выражение с текущей строкой и применяет на результат совпадения указанный цвет. Если в конфигурации указан параметр count=stop, то при совпадении регулярного выражения программа переходит к следующей строке выводимого текста. При отсутствии count=stop указанные настройки применяются последовательно. Вот такой может получится конфигурация:

#разделители строк для вертикального вывода результатов с помощью \G
regexp=[*]+.+[*]+
count=stop
colours=white
-
#границы таблиц
regexp=[+\-|]+
colours=red
-
#цвет текста по умолчанию
regexp=[\w\.]+
colours=green
-
#текст в скобках ( ) и кавычках ' '
regexp=\([\w\d,']+\)
colours=white
-
#числа
regexp=\s[\d\.]+\s
colours=yellow
-
#имена полей при вертикальном выводе с помощью \G
regexp=\w+:
colours=white
-
#даты
regexp=\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}
colours=cyan
-
#IP
regexp=(\d{1,3}\.){3}\d{1,3}(:\d{1,5})?
colours=cyan
-
#поля, таблицы и другие системные сущности в символах ` `
regexp=`\w+`
colours=yellow
-
#email
regexp=[\w\.\-_]+@[\w\.\-_]+
colours=magenta


Сама утилита grcat написана на питоне, любители смогут подсмотреть код и написать конфиг под свои нужды. Для остальных существует документация man grc и неплохое пособие с примерами.

Конфигурационные файлы доступны на github. Эта же ссылка указана в ответе на упомянутый выше вопрос на StackOverflow

И немного приятностей про mysql-client:

Горизонтальная прокрутка результатов
(да и вертикальная тоже, на самом деле) с наводки пользователей nekt и Daedmen:
pager = grcat ~/.grcat | less -RS
Флаг -S активирует горизонтальную прокрутку, -R прокидывает цвета.

Еще интересные флаги для less, спасибо пользователю wickedweasel
-F выходит из less, если всё помещается на один экран
-i ignore case для поиска
-n убирает номера строк
-X не очищает экран после выхода из less, что в консоли бывает полезно — видно результаты предыдущего запроса

Что еще можно делать с помощью pager:
www.mysqlperformanceblog.com/2008/06/23/neat-tricks-for-the-mysql-command-line-pager
Установка удобного приветствия в mysql-client:
www.ultraquantix.com/blog/2008/12/making-the-mysql-prompt-more-useful
Поделиться публикацией
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 30
    +5
    Такая мелочь, но какая приятная. В закладки.
      0
      grc это такой небольшой скриптик на питоне, так что можно обойтись дажже без установки полного пакета. Исходники у автора kassiopeia.juls.savba.sk/~garabik/software/grc/
        +1
        Во втором — перенаправляем вывод через cat, при этом таблица магическим образом пропадает.

        mysql -e "select curdate();" --table | cat -
        

        и таблица на месте.
          0
          Спасибо за уточнение! Добавил комментарий в топик. Но если бы в man эта опция была замечена до --pager, времени ушло бы больше в попытках использовать обертку для табличного вывода :)
          0
          А горизонтальный скроллинг там еще не прикручивается?
            +1
            не тестил, но скорее всего less -S поможет
              0
              Протестировал — работает!
              set pager grcat ~/.grcat | less -RS;

              Опция -R необходима для прокидывания цвета (row contorl chars).

              Спасибо за наводку, добавил в топик!
                0
                описался — raw control chars
                  0
                  Еще интересно прикрутить бы:
                  1. Сворачивание длинных строк что бы не рвало консоль, при этом не потеряв возможность поиска по ним
                  2. Сортировку и группировку результатов
                  3. Возможность прятать/показывать столбцы, ну и менять бы их местами еще
                  4. Постфактумное сохранения результатов запроса
                  5. Построение графиков на основе выборки
                  6. Копирование отдельных столбцов, желательно с выбором разделителей, что бы например быстро выбрать только IDшники для следующего INа

                  И получим полноценную IDE для DB в конcоле
                    0
                    Еще фиксированные заголовки столбцов и фиксированные столбцы — чтобы не уползали при скроллинге.
                      0
                      Хороший список возможностей, аж руки зачесались сделать.

                      Постфактумное сохранения результатов запроса

                      А вот тут вы что имели в виду?
                        0
                        Возможность сохранить результат выборки после того как запрос выполнен, а то иногда бывает выполнился какой-то тяжелый запрос, и только потом понимаешь, что хорошо бы его результаты сохранить куда нибудь в файлик.
                          0
                          Если в качестве пейджера стоит less, то можно при просмотре результата набрать -o, он запросит имя файла для сохранения.
                            0
                            ушел перечитывать manы всех стандартных утилит…
                      +1
                      использую в качестве pager'а less -FSinX, мнемонически легко запомнить :) (для цвета теперь еще понадобится R)
                      Получаются такие плюшки:
                      1) -F выходит из less, если всё помещается на один экран
                      2) -i ignore case для поиска
                      3) -n убирает номера строк
                      4) -X не очищает экран после выхода из less, что в консоли бывает полезно — видно результаты предыдущего запроса
                        0
                        Отличное дополнение, спасибо! Добавил в топик.
                        0
                        Под убунтой grc в упор не видел конфиг (not found), пришлось его положить в ~/.grc/.grcat и запускать grc .grcat — тогда всё находит.
                  0
                  кстати, в моём случае (debian wheezy) пришлось добавить в конец конфига ./.grcat дополнительный перевод строки, без него съедалась последняя буква в последнем слове последней строки.
                    +2
                    Ну а для полного счастья тогда уж и рамочки с помощью sed перечертить:

                    image
                      +2
                      Соам sed-скрипт в догонку:
                      #!/bin/sed -f
                      s!^|!║!g;s!|$!║!g;s!|!│!g;
                      /^+/bp;b
                      :p x;/^╔/bm;/^╟/bl
                      :f x;s!^+!╔!;s!-!═!g;s!+$!╗!;s!+!╤!g;h;b
                      :m x;s!^+!╟!;s!-!─!g;s!+$!╢!;s!+!┼!g;h;b
                      :l x;s!^+!╚!;s!-!═!g;s!+$!╝!;s!+!╧!g;h;b
                      
                      0
                      Неплохо и глазам приятно. Не знал про эту утилиту. Спасибо автору. Меня тоже волнуют проблемы раскраски в консолях. Пользую утилиту ccze. Есть еще «цветной режим» в emacs sql-mode почти для всех клиентов. Особенно навороченный для postgresql.

                        0
                        настроив mysql prompt таким образом

                        prompt =(mysql) \u@\h [\d] >

                        получим информативное приглашение содержащие текущий хост, юзера и бд:

                        (mysql) developer@hostname [db_name] >
                          0
                          А можно и в bashrc присунуть:
                          export MYSQL_PS1="mysql: \d|> "
                          0
                          Это просто праздник какой-то!
                            0
                            похоже что то упустил, сильно не бейте… Куда нужно вводить echo -n "\033[34mHELLO"? Ввожу в консоль оно и выдаёт \033[34mHELLO
                              0
                              в статью вкралась опечатка. Чтобы echo распознавал escape-последовательности, нужен флаг -e. Получится: echo -ne "\033[34mHELLO". В статье поправил.
                              +2
                              Прошу прощения за некрокомментирование, но у меня есть две поправки:

                              1. Конфигурацию для консоли mysql лучше описывать в разделе конфига [client], а не [mysql] — тогда, например, эти настройки не будут подхватываться mysqldump'ом.

                              2. Конфигурацию grcat для mysql лучше хранить в файле ~/.grc/mysql-client, а запускать grcat командой «grcat mysql-client» — утилита сначала ищет имя, заданное в командной строке в папках ~/.grc/ /usr/local/share/grc/ /usr/share/grc/ и только не найдя такового трактует параметр как абсолютный путь к конфигурационному файлу. Таким образом можно удобно разделять конфигурации grcat для разных приложений.
                                0
                                Хорошие дополнения, можно было сразу в pull-request.
                                  0
                                  Что-то в секции [client] опция pager у меня не подхватилась совсем.

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

                                Самое читаемое