Сохранить окраску после обвязки 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