Estou tentando fazer com que cada comando grep destaque seus resultados em uma cor diferente. Eu posso fazer isso manualmente com uma linha como esta:
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
Cada c
personagem será destacado em verde e todo o
personagem será destacado em vermelho, etc ...
Para que este exemplo funcione, você precisará garantir que sempre tenha
--color=always
seus comandos grep. Eu configurei isso no meu.bashrc
modo grep sempre terá cores:
export GREP_OPTIONS='--color=always'
O que estou tentando realizar é agrupar essa funcionalidade com um alias para que eu possa chamar grep
e ter um GREP_COLORS
valor diferente a cada vez. Entendo a consideração de vários shells para cada novo grep canalizado e estou tentando resolver isso criando alguns arquivos (um para cada cor), para indicar que eles já foram usados.
Fiz algumas tentativas, mas estranhamente, essa parece funcionar da melhor maneira. Eu tenho isso no meu .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 "$@"
}
Estou usando este alias assim:
ll | mg c | mg o | mg n | mg f
Os resultados são bem legais. No entanto, existem alguns erros que são ligeiramente diferentes a cada vez. Aqui estão algumas capturas de tela:
Parece que conforme o shell passa por cada comando de pipe, a função anterior ainda não concluiu sua execução. Ele tenta remover arquivos que não existem mais. Não tenho muita certeza de onde command not found
vêm esses outros erros.
Como você pode ver, eu coloquei alguns wait
comandos para tentar deixar a manipulação do arquivo concluída, mas isso não parece estar funcionando muito bem. Outra coisa que eu já tentei é usar memória compartilhada, /dev/shm
mas produziu resultados semelhantes.
Como eu obteria os resultados desejados?
Nota:
Estou procurando respostas que simplesmente envolvam o comando grep, pois ele tem muitas funcionalidades que estou querendo usar e pretendo inserir outra lógica entre os pipes, portanto, não quero fornecer todos os termos de pesquisa de uma só vez. Também não estou procurando outras ferramentas "grep like". Desculpe @terdon, que já postou uma sugestão perl impressionante.
alias mg="mygrep; grep"
?
mygrep;
transforma em um novo comando e o fluxo de dados se perde. O tubo de entrada do ls
seria passado para mygrep;
e não para grep. Pelo menos é assim que eu entendo.
--color=always
todos os seus comandos grep. Eu coloquei isso globalmente no meu .bashrc
. Eu editei isso no post.