MySQL
13 September 2012

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

From Sandbox
Цвет и звук — это те небольшие радости, которые могут разукрасить и облегчить будние администратора при постоянной работе с консолью. Вывод цветовой информации регулируется так называемым 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

+101
27.2k 626
Comments 30