Я пытаюсь заставить каждую команду grep выделять ее результаты другим цветом. Я могу сделать это вручную с помощью такой строки:
ls -l GREP_COLORS='mt=01;32' grep c | GREP_COLORS='mt=01;31' grep o | GREP_COLORS='mt=01;34' grep n | GREP_COLORS='mt=01;36' grep f
Каждый c
символ будет выделен зеленым цветом, а каждый o
символ - красным и т. Д.
Чтобы этот пример работал, вам нужно убедиться, что вы всегда используете
--color=always
команды grep. Я установил это в моем,.bashrc
поэтому у grep всегда будут цвета:
export GREP_OPTIONS='--color=always'
То, что я пытаюсь сделать, это обернуть эту функцию псевдонимом, чтобы я мог просто вызывать grep
и GREP_COLORS
каждый раз иметь другое значение. Я понимаю рассмотрение нескольких оболочек для каждого нового конвейерного grep и пытаюсь преодолеть это путем создания некоторых файлов (по одному для каждого цвета), чтобы указать, что они уже были использованы.
Я сделал несколько попыток, но, как ни странно, эта, похоже, работает «лучше». У меня есть это в моем .bashrc
:
alias mg="mygrep"
mygrep(){
# define possible colors
COLORS=("01;32" "01;31" "01;34" "01;36")
COUNTER=0
NUM=0
# as long as the color has already been used, keep searching
while [ -f /home/lior/Desktop/mygrep_$NUM ]; do
# get a random index
let NUM=`shuf --input-range=0-$(( ${#COLORS[*]} - 1 )) | head -1`
wait ${!}
$(( COUNTER+=1 ))
if [ "$COUNTER" -ge ${#COLORS[@]} ]; then
# remove all color locks
rm /home/lior/Desktop/mygrep_*
wait ${!}
fi
done
# mark this color as used
touch /home/lior/Desktop/mygrep_$NUM
wait ${!}
# lets go!
GREP_COLORS="mt=${COLORS[$NUM]}" grep "$@"
}
Я использую этот псевдоним так:
ll | mg c | mg o | mg n | mg f
Результаты довольно крутые. Однако есть некоторые ошибки, которые немного отличаются каждый раз. Вот пара скриншотов:
Похоже, что оболочка проходит через каждую конвейерную команду, предыдущая функция еще не завершила свое выполнение. Он пытается удалить файлы, которые больше не существуют. Я не слишком уверен, откуда command not found
приходят эти другие ошибки.
Как видите, я добавил несколько wait
команд, чтобы попытаться завершить манипулирование файлами, но, похоже, это работает не слишком хорошо. Еще одна вещь, которую я уже пробовал, - это использовать разделяемую память, /dev/shm
но она дала аналогичные результаты.
Как мне добиться желаемых результатов?
Заметка:
Я ищу ответы, которые просто обертывают команду grep, так как она обладает множеством функциональных возможностей, которые я хочу использовать, и намереваюсь вставить другую логику между каналами, поэтому я не хочу предоставлять все условия поиска одновременно. Я также не ищу другие инструменты типа "grep like". Извините за @terdon, который уже опубликовал отличное предложение Perl.
alias mg="mygrep; grep"
?mygrep;
превращается в новую команду, и поток данных теряется. Входящая труба изls
будет передана,mygrep;
а не grep. По крайней мере, так я это понимаю.--color=always
все ваши команды grep. Я установил это глобально в моем.bashrc
. Я отредактировал это в посте.Ответы:
Вот другой подход. У меня есть небольшой Perl-скрипт, который я уже разместил в другом ответе, который выделит предоставленные пользователем шаблоны в разных цветах. Слегка измененная версия скрипта будет действовать так
grep
:Если вы сохраните этот скрипт как
cgrep
где-то в своемPATH
файле и сделаете его исполняемым, вы можете указать до 10 различных шаблонов, каждый из которых будет напечатан различным цветом:источник
Каждый вызов
grep
в конвейере выполняется в отдельной оболочке, поэтому вам нужно передать некоторое состояние между ними. Следующее решение является грубым способом обработки этого с помощью файла, в котором хранится индекс цвета, и файла блокировки, который гарантирует, что одновременные вызовы не читают одно и то же значение:Тест, предполагая, что вы назвали свою копию
cgrep
и поместили ее в свойPATH
:источник
COLOR_INDEX
иGREP_COLORS
. Я попытался экспортировать их в конце функции без успеха. Это то, что вы имели в виду? Просто иметьexport VAR
, верно?COLOR_TOGGLE
. Спасибо за то, что поймали это :)grep "$@"
предложение - это отсортировало псевдоним для запуска функции, а затем grep.Если вы хорошо разбираетесь в регулярных выражениях, вы можете проверить grc и grcat. grc вызывает grcat.
grcat использует файлы конфигурации, в которые вы можете добавлять регулярные выражения для соответствия тексту, отображаемому в каждом цвете. У этого также есть много других вариантов. По умолчанию используется раскраска файлов системного журнала.
В зависимости от того, что вы имеете в виду для окончательного сценария, вы можете раскрасить вывод только одной командой.
Хитрость заключается в правильном определении регулярных выражений для каждого «поля» в вашем источнике данных. Это будет намного проще, если ваши данные будут относительно однородными по структуре.
В прошлый раз, когда я попробовал это, я не продвинулся слишком далеко, но у меня может быть другой путь, потому что я немного лучше в регулярных выражениях, чем был тогда.
Существует также команда tput, которую можно использовать для отправки информации (например, изменения цвета) непосредственно на ваше оконечное устройство.
Оба подхода описаны ниже. В нем говорится о команде поиска, но она может быть применена к выводу любой команды.
Цветной НАЙТИ выход?
источник