Получение цветных результатов при использовании трубы от grep до менее

246

Я часто использую опцию --colour в grep, но часто я использую и меньше. Как я могу труба grep результаты, чтобы уменьшить и все же сохранить окраску. (Или это возможно?)

grep "search-string" -R * --colour | less 

РЕДАКТИРОВАТЬ :

Я ищу прямое решение или что-нибудь эквивалентное этому.

Джереми Пауэлл
источник
возможный дубликат команды Get colors in 'less' '
Сиро Сантилли,
Что делает *? Со страницы руководства grep: *: The preceding item will be matched zero or more times.Но я все еще не понимаю ..! @JeremyPowell
Шаян

Ответы:

274

Когда вы просто запускаете, grep --colorэто подразумевает, grep --color=autoкоторый определяет, является ли вывод выводом и, если да, включает цвета. Однако, когда он обнаруживает трубу, он отключает окраску. Следующая команда:

grep --color=always -R "search string" * | less

Всегда будет включать окраску и отменять автоматическое определение, и вы получите выделение цветом less.

РЕДАКТИРОВАТЬ: Хотя использование просто lessработает для меня, возможно, старая версия требует -Rфлаг для обработки цветов, как это было предложено.

drrlvn
источник
143
Вам нужно использовать less -Rдля того, чтобы цветовое кодирование было интерпретировано менее корректно
отсюда
1
Это сработало для меня просто less, это может зависеть от версии.
drrlvn
1
(Надеюсь) полезное дополнение: мне нужно было исключить некоторые совпадения, но сохранить цвет, поэтому я фактически закончил с тем grep pattern file | grep -v badpattern | grep --colour=always pattern | less -R, что полностью соответствовало моим потребностям. (Еще раз спасибо!)
Оуэн Блэкер
7
Я не могу поверить, что они просто внедрили функцию обработки цвета lessи поэтому упустили возможность иметь специальный colorlessинструмент. Только для названия это должно было быть сделано! Я, вероятно, должен написать патч, который автоматически вызывает -R, когда исполняемый файл запускается как colorless.
Кристиан
2
@OwenBlacker Возможно, это не псевдоним. Вы могли бы $LESSустановить с -R.
Greyfade
27

Вы можете поместить это в свой .bashrcфайл:

export GREP_OPTIONS="--color=always"

или создайте псевдоним как это:

alias grepc="grep --color=always"

и вам нужно будет использовать -Rопцию для less, как указано оттуда

Деннис Уильямсон
источник
29
Внимание !: GREP_OPTIONS = "- color = всегда" может привести к поломке многих скриптов, использующих grep (или (e | f) grep).
Mctylr
4
Ага, лучше просто псевдоним grep. Вы всегда можете получить чистый grepс помощью GREPили переопределить --colorопцию вручную.
asmeurer
Это не работает для меня, псевдоним работает, хотя.
saeedgnu
9

В таком случае я предпочитаю создавать небольшие sh-файлы и помещать их в них /usr/local/bin.
Я обычно использую grepрекурсивный способ pwd, так что это мой личный сценарий:

#!/bin/sh
grep --color=always -r "$@" . | less -R

А потом я просто скопировал его как /usr/local/bin/g(да, я часто его использую)

Iazel
источник
2
Почему бы просто не использовать функции оболочки для такого рода вещей? g() { grep --color=always -r "$@" . | less -R }работает идентично и, вероятно, даст (чуть-чуть) лучшую производительность.
00
1
@ 00dani Да, это тоже правильная альтернатива, и иногда я ее использую. Обратите внимание, что в этом случае большая часть времени тратится на ввод-вывод и, следовательно, ощутимого повышения производительности не происходит :) Другое отличие состоит в том, что, попав в PATH, этот сценарий можно использовать и с другими сценариями оболочки и псевдонимами; вместо этого функция должна быть явно загружена
Iazel
1

Не используйте псевдоним "grep", лучше псевдоним "less", который никогда не используется оболочками. По твоему .bashrcпросто поставь alias less="less -r".

not2qubit
источник
3
Не совсем верно. Нужно использовать оба grep --color=always и less -R. Обратите внимание, что grep знает только, что он передается в какой-то другой процесс, и --color=autoопция использует только эту информацию, чтобы решить, будут ли выводить цвета или нет.
brandizzi
3
Обратите внимание, что lessпараметр -rотличается от -R. Наверное -R, безопаснее.
Крейг МакКуин
1
Так почему бы отказаться от моего решения. ОП специально запрашивает lessпример, в котором уже используется опция --color.
not2qubit
3
Псевдоним здесь, вероятно, нежелателен. lessподдерживает $LESSпеременную окружения. Таким образом, вместо псевдонима, export LESS='-R'может быть предпочтительнее.
Greyfade
0

Мне нужно бежать

grep --color=always -R "search string" * | less - r

с флагом -r после less для запуска.

Пьер Франсуа
источник
Что делает *? Со страницы руководства grep: *: The preceding item will be matched zero or more times.Но я все еще не понимаю ..!
Шаян