Вывод цветовой подсветки на основе регулярных выражений в оболочке - PullRequest
40 голосов
/ 24 ноября 2010

Я хотел бы знать, могу ли я выделить цветом вывод команды shell, которая соответствует определенным строкам.

Например, если я запускаю myCommand со следующим выводом:

> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak

Я бы хотел, чтобы все строки, соответствующие ^ ERROR \ s. *, Были выделены красным.1007 * Точно так же я хотел бы, чтобы ту же подсветку применяли к выводу grep, меньше и т. Д.опция 'profile' в моем .bashrc.

Ответы [ 8 ]

44 голосов
/ 15 июня 2012

Ответ есть в superuser.com :

your-command | grep -E --color 'pattern|$'

или

your-command | grep --color 'pattern\|$'

Это будет "соответствовать вашему шаблону или концу строки в каждой строке. Выделен только шаблон ..."

25 голосов
/ 24 ноября 2010

Вы можете использовать такие программы, как:

Вы можетесделать что-то вроде этого, но команды не будут видеть tty (некоторые откажутся работать или вести себя по-другому или делать странные вещи):

exec > >(histring -fEi error)    # Bash
13 голосов
/ 24 ноября 2010

Вы можете попробовать (возможно, нужно немного побег):

BLUE="$(tput setaf 4)"
BLACK="$(tput sgr0)"
command | sed "s/^ERROR /${BLUE}ERROR ${BLACK}/g"
12 голосов
/ 25 ноября 2010

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

Я не знаю ни одного «обычного» терминала с этой функцией. Это легко сделать в Emacs, в буфере term: настроить font-lock-keywords для term-mode.

Однако вы должны тщательно подумать, действительно ли вы хотите эту функцию все время. Что если команда имеет свои собственные цвета (например, grep --color, ls --color)? Возможно, было бы лучше определить короткий псевдоним для команды colorizer и запустить myCommand 2>&1|c, если вы хотите раскрасить вывод myCommand. Вы также можете псевдоним некоторых конкретных команд всегда цвета .

Обратите внимание, что возвращаемое состояние конвейера - это его команда last , поэтому, если вы запустите myCommand | c, вы получите статус c, а не myCommand. Вот оболочка bash, которая позволяет избежать этой проблемы, которую вы можете использовать как w myCommand:

w () {
  "$@" | c
  return $PIPESTATUS[0]
}
2 голосов
/ 02 августа 2015

Вы можете использовать команду hl, доступную на github:
мерзавец клон http://github.com/mbornet-hl/hl

Тогда:
myCommand | hl -r '^ ОШИБКА. *'

Вы можете использовать файл конфигурации $ HOME / .hl.cfg для упрощения командной строки.
гл написан на С (источник доступен). Вы можете использовать до 42 разных цветов текста.

2 голосов
/ 29 января 2015

Попробуйте

tail -f yourfile.log | egrep --color 'DEBUG|'

где DEBUG - текст, который вы хотите выделить.

1 голос
/ 24 ноября 2010

Возможно, вы могли бы включить его для определенных команд, используя псевдонимы и определяемые пользователем функции оболочки, без особых проблем. Если ваши ошибки окраски я предполагаю, что вы хотите обработать stderr. Поскольку stderr в небуферизированном виде, вы, вероятно, захотите буферизовать его, отправив через fifo.

0 голосов
/ 05 августа 2015

Используйте awk.

 COLORIZE_AWK_COMMAND='{ print $0 }'
 if [ -n "$COLORIZE" ]; then
     COLORIZE_AWK_COMMAND='
     /pattern1/ { printf "\033[1;30m" }
     /pattern2/ { printf "\033[1;31m" }
     // { print $0 "\033[0m"; }'
 fi

потом вы можете передать свой вывод

... | awk "$COLORIZE_AWK_COMMAND"

printf используется в шаблонах, поэтому мы не печатаем новую строку, просто устанавливаем цвет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...