Подтвердить что ты не робот

Вывод выделения цвета на основе регулярного выражения в оболочке

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

Например, если я запустил myCommand с выходом ниже:

> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak

Я хочу, чтобы все строки соответствовали символу ^ ERROR\s. *, выделенному красным цветом.

Аналогично, я хотел бы, чтобы одна и та же подсветка была применена к выходу grep, меньше и т.д....

EDIT: Я, наверное, должен упомянуть, что в идеале я бы хотел включить эту функцию во всем мире с помощью опции "profile" в моем .bashrc.

4b9b3361

Ответ 1

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

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

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

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

w () {
  "[email protected]" | c
  return $PIPESTATUS[0]
}

Ответ 2

В superuser.com есть ответ:

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

или

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

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

Ответ 3

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

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

exec > >(histring -fEi error)    # Bash

Ответ 4

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

BLUE="$(tput setaf 4)"
BLACK="$(tput sgr0)"
command | sed "s/^ERROR /${BLUE}ERROR ${BLACK}/g"

Ответ 5

Try

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

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

Ответ 6

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

Тогда:
myCommand | hl -r '^ ERROR. *'

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

Ответ 7

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

Ответ 8

Использовать 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 используется в шаблонах, поэтому мы не печатаем новую строку, просто устанавливаем цвет.

Ответ 9

Я не вижу разговоров об iterm2 вообще (из-за тега linux). Вы можете достичь этого в iterm2 с помощью триггеров.