Отримання кольорових результатів при використанні труби від grep до менше


246

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

grep "search-string" -R * --colour | 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.

EDIT: Хоча використання просто lessпрацює для мене, можливо, для старих версій потрібен -Rпрапор для обробки кольорів, як це було запропоновано.


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або замінити --colorпараметр вручну.
asmeurer

Це не працює для мене, хоча псевдонім працює.
saeedgnu

9

У такому випадку я вважаю за краще створити невеликі файли sh та розмістити їх /usr/local/bin.
Я зазвичай використовую grepрекурсивний спосіб на pwd, так що це мій особистий сценарій:

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

А потім я просто скопіював це як /usr/local/bin/g(так, я дуже багато використовую)


2
Чому б просто не використовувати функції оболонки для подібних речей? g() { grep --color=always -r "$@" . | less -R }працює однаково і, ймовірно, дасть (щомісяця) кращі показники.
00дані

1
@ 00dani Так, це теж достовірна альтернатива, і іноді я її використовую. Зверніть увагу, що в цьому випадку більша частина часу проводиться в IO, і тому немає відчутного підвищення продуктивності :) Інша відмінність полягає в тому, що один раз у вашому PATH цей скрипт можна використовувати і з іншими скриптами оболонки та псевдонімами; функцію замість цього потрібно явно завантажувати
Iazel

1

Не псевдонім "grep", краще псевдонім "менше", який ніколи не використовується оболонками. У вашому .bashrcпросто покласти: alias less="less -r".


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 після менше , щоб це запустилося.


Що робить *? З чоловічої сторінки grep: *: The preceding item will be matched zero or more times.Але я все ще не розумію ..!
Шаян
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.