В разделе « Сохранить ls-раскраску после grep'ing» есть аналогичный вопрос, но меня раздражает, что если вы передадите цветной вывод grep в другой grep, раскраска не сохраняется.
В качестве примера grep --color WORD * | grep -v AVOID
не сохраняет цвет первого вывода. Но для меня ls | grep FILE
цвет сохраняется, почему разница?
Ответы:
grep
иногда отключает цветной вывод, например, при записи в канал. Вы можете изменить это поведение с помощьюgrep --color=always
Правильная командная строка будет
Это довольно многословно, в качестве альтернативы вы можете просто добавить строку
alias cgrep="grep --color=always"
к вашему,
.bashrc
например, и используйтеcgrep
как цветной grep. При переопределенииgrep
вы можете столкнуться с проблемами со сценариями, которые зависят от конкретного выводаgrep
и не любят escape-код ascii.источник
grep
.alias grep='grep --color=auto
поэтому мне нужно просто изменить мой,~/.bashrc
где он был определен в первую очередь.Небольшой совет:
При использовании
grep --color=always
фактические строки, передаваемые в следующий канал, будут изменены. Это может привести к следующей ситуации:$ grep --color=always -e '1' * | grep -ve '12' 11 12 13
Несмотря на то, что параметр
-ve '12'
должен исключать среднюю линию, этого не произойдет, потому что между1
и есть цветные символы2
.источник
--color=auto
, то он должен уловить тот факт, что вы подключаете его где-то еще, и полностью подавить цвета, но это как бы нарушает цель. Если вам все еще нужны цветные результаты, я думаю, вы можете снова использовать grep при последнем использовании канала--color
.--color=always
действительно работает, я полагаю, с оговорками, указанными выше.Просто повторите ту же команду grep в конце конвейера.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD
источник
grep -v AVOID * | grep WORD
Существующие ответы относятся только к случаю, когда команда ПЕРВАЯ
grep
(по запросу OP, но эта проблема возникает и в других ситуациях).Более общий ответ
Основная проблема в том, что команда BEFORE
| grep
пытается быть «умной», отключая цвет, когда понимает, что вывод идет в канал. Обычно это именно то, что вам нужно, чтобы escape-коды ANSI не мешали вашей последующей программе.Но если вы хотите, чтобы цветной вывод происходил из более ранних команд, вам нужно принудительно создавать цветовые коды независимо от приемника вывода. Механизм принуждения зависит от программы.
Git: используйте -c color.status = always
Примечание:
-c
опция должна идти ДО подкомандыstatus
.Другие
(это сообщение вики сообщества, так что не стесняйтесь добавлять свои)
источник