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