Я хочу цветной вывод grep
.
.... Но
- Стратегия 1: GREP_OPTIONS. Но это не рекомендуется. См. Http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html.
- Stragegy 2: GREP_COLORS на первый взгляд выглядит как решение, но это делает что-то другое.
- Стратегия 3: псевдоним. Это не работает
find ... | xargs grep
, поскольку xargs не оценивает псевдонимы. - Стратегия 4: Напишите простой скрипт-обертку. Нет, я думаю, что это слишком грязно и создает больше проблем, чем решает.
- Стратегия 5: патч исходного кода
- Стратегия 6: Свяжитесь с разработчиками grep, попросите замену GREP_OPTIONS
- Стратегия NICE-и-EASY: ... этого не хватает. Я понятия не имею.
Как это решить?
Спасибо за попытку помочь!
... но я не могу дать награду
Назовите меня грубым, ароматным, оскорбительным, оскорбительным ....
Я вижу только обходные пути - нет решения. Нет ответа удовлетворил вопрос.
Спасибо за старания.
color_option
на2
...--color
Вариант уже имеет значениеauto
. Я просто не знаю, почему вы не можете активировать его по умолчанию.exec grep --color=auto "$@"
), опционально с другим именем (grepc
илиcolorgrep
). Это имеет незначительные накладные расходы (и не требует дополнительных параллельных процессов во время выполнения). Причина, по которой вы назвали их «недостаточно простыми», заключается в том, что вы не считаете эту функцию достаточно полезной, чтобы тратить (относительно небольшие) разовые усилия на ее реализацию, и ищете, чтобы кто-то другой сделал ее за вас. Из-за этого ваши «не совсем ответные» комментарии к опубликованным ответам являются довольно грубыми.Ответы:
Некоторые из причин, по которым OP указала, что варианты являются неподходящими, не имеют под собой реальной основы. Здесь я покажу, какие эффекты использует стратегия 4 OP:
В большинстве дистрибутивов
grep
устанавливается в/bin
(обычный) или/usr/bin
(OpenSUSE, может быть, в другие), и по умолчаниюPATH
содержит/usr/local/bin
до/bin
или/usr/bin
. Это означает, что если вы создаете/usr/local/bin/grep
сгде
/bin/sh
POSIX-совместимая оболочка, предоставляемая вашим дистрибутивом, обычно bash или dash. Еслиgrep
есть/usr/bin
, то сделайте этоНакладные расходы этого скрипта минимальны. Это
exec
утверждение означает, что интерпретатор сценария заменяетсяgrep
двоичным; это означает, что оболочка не остается в памяти воgrep
время выполнения. Таким образом, единственные накладные расходы - это одно дополнительное выполнение интерпретатора сценария, то есть небольшая задержка во времени настенных часов. Задержка примерно постоянной (изменяется только в зависимости от того ,grep
иsh
уже в кэше страницы или нет, и от того, как полоса пропускания много ввода / вывода доступна), и не зависит от того, как долгоgrep
исполняет или сколько данных он обрабатывает.Итак, как долго эта задержка, то есть накладные расходы, добавленные сценарием оболочки?
Чтобы выяснить это, создайте приведенный выше скрипт и запустите
На моей машине первый занимает 0,005 с в реальном времени (при большом количестве прогонов), тогда как второй занимает 0,006 с в реальном времени. Таким образом, накладные расходы на использование оболочки на моей машине составляют 0,001 с (или меньше) за вызов.
Это незначительно.
Я также не вижу ничего «грязного» в этом, потому что многие обычные приложения и утилиты используют один и тот же подход. Чтобы увидеть список таких на вашей машине в
/bin
и/usr/bin
, просто запуститеНа моей машине выше выход включает в себя
egrep
,fgrep
,zgrep
,which
,7z
,chromium-browser
,ldd
, иxfig
, которые я использую довольно часто. Если вы не считаете весь свой дистрибутив «грязным» для использования сценариев-оболочек, у вас нет оснований считать такие сценарии-оболочки «грязными».Что касается проблем, такой скрипт-обертка может вызвать:
Если только человеческие пользователи (в отличие от скриптов) используют версию Grep , что по умолчанию цвета поддержки , если выход является на терминал, то сценарий обертка может быть именем
colorgrep
илиcgrep
или независимо от того, что ОП считает нужным.Это позволяет избежать всех возможных проблем совместимости, поскольку поведение
grep
не изменяется вообще.Включение
grep
параметров с помощью сценария-оболочки, но таким образом, чтобы избежать каких-либо новых проблем:Мы можем легко переписать скрипт-обертку для поддержки пользовательского,
GREP_OPTS
даже если онGREP_OPTIONS
не поддерживается (так как он уже устарел). Таким образом, пользователи могут просто добавитьexport "GREP_OPTIONS=--color=auto"
свой профиль или подобный ему./usr/local/bin/grep
затемОбратите внимание, что вокруг нет кавычек
$GREP_OPTIONS
, поэтому пользователи могут указать более одного параметра.В моей системе выполнение
time /usr/local/bin/grep --version
сGREP_OPTIONS
пустым или сGREP_OPTIONS=--color=auto
таким же быстрым выполнением, как и в предыдущей версии сценария оболочки; т.е. обычно выполняется на одну миллисекунду дольше, чем обычныйgrep
.Это последняя версия, которую я лично рекомендую для использования.
Таким образом, стратегия ОП 4:
рекомендуется
grep
разработчикамтривиально реализовать (две строки)
имеет незначительные накладные расходы (дополнительная задержка в одну миллисекунду на вызов на этом конкретном ноутбуке; легко проверяется на каждой машине)
может быть реализован в виде скрипта-обёртки, который добавляет
GREP_OPTS
поддержку (вместо устаревшего / неподдерживаемогоGREP_OPTIONS
)может быть реализован (как
colorgrep
/cgrep
), который не затрагивает сценарии или существующих пользователей вообщеПоскольку этот метод уже широко используется в дистрибутивах Linux, это обычный метод, а не «грязный».
Если он реализован как отдельная оболочка (
colorgrep
/cgrep
), он не может создавать новые проблемы, так как он вообще не влияет наgrep
поведение. При реализации в виде сценария-обертки, который добавляетGREP_OPTS
поддержку, использованиеGREP_OPTS=--color=auto
имеет те же риски (по сравнению с существующими сценариями), что и при добавлении по умолчанию в исходной версии--color=auto
. Таким образом, комментарий о том, что это «создает больше проблем, чем решает», совершенно неверен: никаких дополнительных проблем не создается.источник
Документация, которую вы предоставляете с первой стратегией, гласит:
Так что, если псевдоним для вас невозможен, сценарий-обертка - единственный способ.
источник
Причина, по которой
GREP_OPTIONS
переменная устарела, состоит в том, что она имеет тенденцию вызывать проблемы, когдаgrep
вызывается где-то в скрипте, и скрипт не работает с альтернативными опциями, которые приходят из переменной. Если вы напишите скрипт-обертку дляgrep
вас, у вас возникнет та же проблема, если вы не дадите ему другое имя .Кроме того, храните ваши любимые параметры в переменной. В оболочках, отличных от zsh, это неудобно, если параметры содержат символы подстановки (
\[*?
), но в противном случае вы можете просто использовать переменную без кавычек, чтобы получить команду с аргументами.Обратите внимание, что GNU и BSD grep могут рекурсивно обрабатывать дерево каталогов, что устраняет необходимость
find
в сочетании сgrep
большей частью времени.источник
grep
вам нужна команда с другим именем, или, если вы сохраняете то же имя, вы нарушите сценарии, которые ожидают оригинального / стандартного поведения. Это самый чистый и не доставляет дополнительных хлопот .Самое простое - использовать псевдоним (стратегия 3). Если вы действительно заботитесь о
xargs
команде, вы все равно можете переопределить ее с помощью функции bash.Но это не лучше, чем использование команды-оболочки, которая кажется рекомендуемым решением для
grep
команды:По моему скромному мнению, вы должны связаться с
grep
командой разработчиков, чтобы попросить их предоставить простую заменуGREP_OPTIONS
переменной, которая включит цвет вgrep
соответствии с некоторой переменной среды.Для них было бы довольно просто включить опцию по умолчанию
color
или когдаGREP_COLORS
она была установлена.источник
Это решение из верхнего ответа от @NominalAnimal, но с обычным
grep: ...
предупреждением (вместо/bin/grep: ...
):источник