Вывод выделения цвета на основе регулярного выражения в оболочке
Я хотел бы знать, могу ли я выделить цветной вывод команды оболочки, которая соответствует определенным строкам.
Например, если я запустил myCommand с выходом ниже:
> myCommand
DEBUG foo bar
INFO bla bla
ERROR yak yak
Я хочу, чтобы все строки соответствовали символу ^ ERROR\s. *, выделенному красным цветом.
Аналогично, я хотел бы, чтобы одна и та же подсветка была применена к выходу grep, меньше и т.д....
EDIT: Я, наверное, должен упомянуть, что в идеале я бы хотел включить эту функцию во всем мире с помощью опции "profile" в моем .bashrc.
Ответы
Ответ 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 с помощью триггеров.