Сохранить окраску после обвязки grep в grep

Есть такой же вопрос в Preserve ls раскраски после grep'а, но меня раздражает, что если вы перенаправляете вывод grep в другой grep, то раскраска не сохраняется.

В качестве примера grep --color WORD * | grep -v AVOID не сохраняет цвет первого вывода. Но для меня ls | grep FILE сохранить цвет, почему разница?

3 ответа

Решение

grep иногда отключает вывод цвета, например, при записи в канал. Вы можете изменить это поведение с помощью grep --color=always

Правильная командная строка будет

grep --color=always WORD * | grep -v AVOID

Это довольно многословно, в качестве альтернативы вы можете просто добавить строку

alias cgrep="grep --color=always"

на ваш .bashrc например и использовать cgrep как цветной греп. При переопределении grep вы можете столкнуться с проблемами со сценариями, которые зависят от конкретного вывода grep и не люблю ESCII escape-код.

Слово совета:

Когда используешь grep --color=alwaysфактические строки, передаваемые на следующий канал, будут изменены. Это может привести к следующей ситуации:

$ grep --color=always -e '1' * | grep -ve '12'
11
12
13

Хотя вариант -ve '12' следует исключить среднюю линию, это не произойдет, потому что между 1 а также 2,

Существующие ответы относятся только к случаю, когда ПЕРВАЯ команда grep (по запросу ОП, но эта проблема возникает и в других ситуациях).

Более общий ответ

Основная проблема в том, что команда BEFORE | grep, пытается быть "умным", отключая цвет, когда понимает, что вывод идет в конвейер. Обычно это именно то, что вам нужно, чтобы escape-коды ANSI не мешали вашей последующей программе.

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

Git: используйте -c color.status=always

git -c color.status=always status | grep -v .DS_Store

Обратите внимание -c опция должна появиться ДО подкоманды status.

Другие

(это сообщение вики сообщества, так что не стесняйтесь добавлять свои)

Хотя и немного "хакерский", он также просто повторяет команду grep в конце канала.
grep WORD * | grep -v AVOID | grep WORD

Другие вопросы по тегам