Как сохранить цветовые коды с помощью ввода grep?

15

Если я использую две последовательные grepкоманды, например:

echo "foo bar" | grep foo | grep bar

Тогда первый шаблон ("foo") не подсвечивается. На самом деле, похоже, что grep удаляет коды цветов из своего ввода. Есть ли способ предотвратить это?

Chris2048
источник
Другой вопрос с тем же ответом: как вы можете восстановить цветной вывод в grep в функции bash?
Камиль Гудесюн

Ответы:

23

Использование --color=always.

grepопределяет, является ли вывод в канал (или файл). Вы больше никогда не хотите, чтобы цвета выводились в файл - так как это экранирующие последовательности для терминала. Как правило:

foo ^[[01;31m^[[Kbar^[[m^[[K

например:

grep pattern file > result

Переопределить использование --color=always.

grep --color=always pattern file | ...

Пример:

Имея файл:

ID=111;Year=2013;foo=bar
ID=222;Year=2013;foo=baz

потом

grep --color=always ID file | grep --color=always 2013 | grep foo

будет цвет ID, 2013и foo.

grep --color=always ID file | grep 2013 | grep foo

будет цвет IDи foo, но нет 2013.

1 Важно: Вы также должны помнить, что добавленный беспорядок из цветов передается следующей команде в цепочке. Как только ID раскрашен, вы не можете (легко), например, сопоставитьID=111.


В некоторых случаях можно было бы хотеть терминальные цвета в файле . Попробуйте например

 grep --color=always foo file > result
 cat result

Хотя полученный файл будет очень ограничен в переносимости.


Сама раскраска также является продолжением.


Как упоминалось в добром @slm , вы можете добавить:

export GREP_OPTIONS="--color=always"

на ваш и .bashrcт. д., но не, если вы по какой-то причине действительно не понимаете последствий и по-прежнему хотите это сделать. Это во многом сломалось бы grepиз-за факта, упомянутого выше 1 .

Добавьте, aliasесли вы используете его часто.

 alias cgrep='grep --color=always'

GREP_OPTIONSи --color принять три варианта : never, autoи always. Два первых должны быть единственными для рассмотрения GREP_OPTIONS.

Вы также можете проверить GREP_COLORSна manстраницах или в GNU grep .

Runium
источник
Дополнительные подробности о плюсах и минусах этого метода здесь: stackoverflow.com/questions/867877/…
slm
1
добавьте это и к ответу: export GREP_OPTIONS="--color=always"в .bashrc делает опции значениями по умолчанию для любых greps, и вы в значительной степени прибили это!
SLM
Хорошие вещи в этом Super Uuser Q & A: superuser.com/questions/36022/…
slm
"grep обнаруживает, если вывод на канал" - ага! Это ключ, grep не окрашивает, если это часть трубы. Должен быть принцип замещения против такого рода вещей: - /
Chris2048
@ Chris2048: это стандартная для большинства инструментов печать цветов на терминал. Вы можете найти более подробно на этом , о том , как оно было обнаружено, и это показывают некоторые проблемы, например , путем Лс цветов на OSX родных lsи гну Coreutils.
Runium