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 lals
pasaría amygrep;
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.Respuestas:
Aquí hay un enfoque diferente. Tengo un pequeño script de Perl que ya publiqué en otra respuesta que resaltará los patrones proporcionados por el usuario en diferentes colores. Una versión ligeramente modificada del script actuará como
grep
:Si guarda esa secuencia de comandos como
cgrep
parte de suPATH
y la hace ejecutable, puede especificar hasta 10 patrones diferentes, cada uno de los cuales se imprimirá en un color diferente:fuente
Cada invocación de
grep
en una tubería se ejecuta en un shell separado, por lo que deberá pasar algún estado entre ellos. La siguiente solución es una forma cruda de manejar eso con un archivo que mantiene el índice de color y un archivo de bloqueo que garantiza que las llamadas simultáneas no lean el mismo valor:Pruebe suponiendo que ha nombrado su copia
cgrep
y póngala en suPATH
:fuente
COLOR_INDEX
yGREP_COLORS
. Intenté exportarlos al final de la función sin éxito. ¿Es eso lo que querías decir? Simplemente para tenerexport VAR
, ¿verdad?COLOR_TOGGLE
. Gracias por atraparlo :)grep "$@"
sugerencia, que resolvió el alias para ejecutar la función y luego grep.Si eres bueno con las expresiones regulares, es posible que desees consultar grc y grcat. grc llama grcat.
grcat utiliza archivos de configuración donde puede agregar expresiones regulares para que coincidan con el texto que se mostrará en cada color. También tiene una serie de otras opciones. El valor predeterminado es colorear los archivos de registro del sistema.
Dependiendo de lo que tenga en mente para su script final, es posible que pueda colorear su salida con solo un comando.
El truco es especificar las expresiones regulares correctamente para cada "campo" en su fuente de datos. Esto será mucho más fácil si sus datos tienen una estructura relativamente uniforme.
La última vez que lo probé, no llegué demasiado lejos, pero es posible que tenga otra oportunidad porque soy un poco mejor en expresiones regulares de lo que era entonces.
También está el comando tput que se puede usar para enviar información (como cambios de color) directamente a su dispositivo terminal.
Ambos enfoques están cubiertos por la publicación a continuación. Habla sobre el comando find, pero se puede aplicar a la salida de cualquier comando.
Color ENCONTRAR salida?
fuente