Збережіть фарбування після того, як трубопроводити грейп до грейфу


140

Існує симпатичне запитання щодо збереження фарбування ls після grep'ing, але це мене дратує, що якщо ви переведете кольоровий греп на вихід в інший греп, то забарвлення не збережене.

Як приклад grep --color WORD * | grep -v AVOIDне зберігається колір першого виходу. Але для мене все-таки ls | grep FILEзберігають колір, чому різниця?


2
Це питання видається поза темою, оскільки воно стосується використання команд Unix, належить до unix.stackexchange.com
Raptor

Відповіді:


162

grepіноді вимикає кольоровий вихід, наприклад, під час запису на трубу. Ви можете змінити цю поведінкуgrep --color=always

Правильний командний рядок був би

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

Це досить багатослівно, або ви можете просто додати рядок

alias cgrep="grep --color=always"

до вашого .bashrc, наприклад , і використання в cgrepякості кольорового Grep. Під час повторного визначення у grepвас можуть виникнути проблеми зі скриптами, які покладаються на певний вихід grepта не люблять код втечі ascii.


4
Це рішення працює лише за певних щасливих обставин. Дивіться відповідь Андерсонвого нижче.
студог

У моєму випадку (Ubuntu) у мене вже був псевдонім grep. alias grep='grep --color=autoтому мені потрібно просто змінити своє місце, ~/.bashrcде це було визначено в першу чергу.
sobi3ch

Не працює для мене - схожий на цей сценарій stackoverflow.com/a/7640077/248616
Nam G VU

Ця приємна креативна ідея - це просто простий та робочий stackoverflow.com/a/36288791/248616
Nam G VU

питання полягає в тому, як зробити так, щоб другий греп не придушив колір першого. Це не відповідь на це.
johannes_lalala

74

Слово поради:

При використанні grep --color=alwaysфактичні рядки, що передаються на наступну трубу, будуть змінені. Це може призвести до наступної ситуації:

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

Навіть незважаючи на те, що опція -ve '12'повинна виключати середню лінію, це не буде тому, що між 1і між ними є кольорові символи 2.


Якщо ви користуєтесь --color=auto, то він повинен підбирати той факт, що ви переносите його десь в іншому місці, і взагалі придушувати кольори, але це начебто перемагає мету. Якщо ви все ще хочете кольорових результатів, я думаю, ви могли б знову зіткнути його на останній трубці --color.
andersonvom

2
Принаймні, на Mac OS X фарбування в останній трубі, як підказує @andersonvom, не працює. Не впевнений, чому; можливо, це забарвлення виключеного малюнка? --color=alwaysчи працює, я думаю, із зазначеними вище застереженнями.
користувач766353

3
У вашому виразі ви повинні мати один і той же малюнок грепа. Я щойно перевірив це на mac: http://i.imgur.com/BhmwAlF.png
andersonvom

9

Просто повторіть ту саму команду grep в кінці своєї труби.
grep WORD * | grep -v AVOID | grep -v AVOID2 | grep WORD


2
Чи не повернення команд дасть однаковий результат? grep -v AVOID * | grep WORD
Брайдон Гібсон

@BrydonGibson, ймовірно, але це був приклад, який показує, що він працює для будь-якої кількості
Alex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.