Я пытаюсь заставить каждую команду 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. Я отредактировал это в посте.



