Estoy tratando de hacer que cada comando grep resalte sus resultados en un color diferente. Puedo hacerlo manualmente con una línea 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
personaje se resaltará en verde y cada o
personaje se resaltará en rojo, etc.
Para que este ejemplo funcione, deberá asegurarse de tener siempre
--color=always
sus comandos grep. He configurado esto en mi.bashrc
grep siempre tendrá colores:
export GREP_OPTIONS='--color=always'
Lo que intento lograr es envolver esta funcionalidad con un alias para poder llamar grep
y tener un GREP_COLORS
valor diferente cada vez. Entiendo la consideración de múltiples shells para cada nuevo grep entubado y estoy tratando de superar esto creando algunos archivos (uno para cada color), para indicar que ya se han utilizado.
He hecho algunos intentos, pero extrañamente, este parece funcionar "lo mejor". Tengo esto en mi .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 "$@"
}
Estoy usando este alias así:
ll | mg c | mg o | mg n | mg f
Los resultados son bastante geniales. Sin embargo, hay algunos errores que son ligeramente diferentes cada vez. Aquí hay un par de capturas de pantalla:
Parece que a medida que el shell pasa por cada comando de tubería, la función anterior aún no terminó su ejecución. Intenta eliminar archivos que ya no existen. No estoy muy seguro de dónde command not found
provienen esos otros errores.
Como puede ver, he puesto algunos wait
comandos para intentar dejar que se complete la manipulación del archivo, pero esto no parece funcionar demasiado bien. Otra cosa que ya he intentado es usar memoria compartida /dev/shm
pero arrojó resultados similares.
¿Cómo haría para obtener los resultados que quiero?
Nota:
Estoy buscando respuestas que simplemente envuelvan el comando grep, ya que tiene muchas funciones que quiero usar e intento insertar otra lógica entre las tuberías, por lo que no quiero proporcionar todos los términos de búsqueda a la vez. Tampoco estoy buscando otras herramientas "grep like". Perdón por @terdon que ya ha publicado una increíble sugerencia de perl.
alias mg="mygrep; grep"
?
mygrep;
convierte en un nuevo comando en sí mismo y el flujo de datos se pierde. La tubería entrante de la ls
pasaría a mygrep;
y no a grep. Al menos así es como lo entiendo.
--color=always
todos sus comandos grep. Lo he establecido globalmente en mi .bashrc
. Lo he editado en la publicación.