comando `resaltar`

11

¿Hay un comando que se pueda usar para resaltar fácilmente (con colores, texto en negrita o con el fondo invertido / invertido) cadenas específicas en stdin mientras se pasa toda la cadena a stdout? Estoy pensando en construirlo , pero prefiero usarlo si ya existe. Algunas características deseables:

  1. Las cadenas de resaltado separadas se resaltan de manera diferente, de forma automática. Por ejemplo, la primera cadena se resaltará en rojo, la segunda en verde, la tercera en azul sin configuración manual .
  2. Detecta el soporte de color y recurre a negrita / invertida / otros métodos de resaltado donde están disponibles.
  3. Permitir la coincidencia de expresiones regulares y cadenas literales.
  4. Preferiblemente hace algo inteligente si las coincidencias se superponen, como "foobar" y "barbar".
  5. Nada se modifica entre stdin y stdout, excepto la adición de códigos de color.
l0b0
fuente
Ooo, buena pregunta. Necesitaba esto exactamente y terminé escribiendo algo, pero solo tenía cadenas fijas codificadas por colores, no tenía ninguna de las características que enumeró
Michael Mrozek
En lugar de escribir una nueva utilidad, sería súper increíble ver esto como una adición al grep.
mattdm
1
La filosofía adecuada de Unix sería una nueva utilidad que se puede canalizar no solo desde grep sino también desde otras transmisiones. Sin embargo, sospecho que hay al menos uno o más módulos Perl que probablemente puedan hacer esto por usted ...
Shadur
1
@Gilles: Esa pregunta tiene un alcance mucho más limitado. De hecho, leerlo fue una de las razones por las que creé esta pregunta: para pedir una solución más general y flexible.
l0b0

Respuestas:

4

¿Quizás el colorante genérico de Radovan Garabík (grc) ? Espera un archivo de configuración como argumento y funciona con regexp's. Por lo tanto, no del todo sin la configuración, pero puede usar la sustitución del proceso del proceso ( <(list)), por lo que, por supuesto, sin configuración manual :-)

artistoex
fuente
Para aclarar sin necesidad de abrir la página (y hacer que se pueda buscar), "this" == Colouriser genérico ; GRC y grcat ... Gracias, me gusta.
Peter.O
grctiene un script de ayuda: grcat. Aquí hay un ejemplo de colorear todas las letras mayúsculas en rojo. Paso 1: Configura el archivo de configuración: printf "regexp=[A-Z]\ncolours=red\n" > ~/.grc/red-caps Paso 2; Úselo: echo Hello World | grcat red-caps... La página de manual indica 3 directorios de configuración que busca, y luego sugiere (?) Que el archivo de configuración puede ser una ruta absoluta, pero este último método para encontrar el archivo de configuración solo funciona con rutas relativas para mí (grc versión 1.3)
Peter.O
5

¡Sed al rescate!

Puede mejorar esto (ya que realmente lo necesita) pero funciona bastante bien.

$ cat >~/bin/hilight <<EOF
#!/bin/bash
while [ $# -gt 0 ]
do
 COMANDO=$COMANDO's/'$1$'/\033[01;'$2$'m\033[K\\0\033[m\033[K/g\n'
 shift;shift;
done

sed -e "$COMANDO"
EOF

En aras de la simplicidad, hilight acepta un par de argumentos (primero la coincidencia, segundo el color) En este script, el atributo siempre está en negrita

Lea man console_codes (Graphic Rendition) para ver secuencias de escape de color, o intente esto

for attrib in $(seq 0 12); do
  for color in $(seq 30 37) $(seq 40 47) $(seq 90 97); do
    printf %b " $attrib $color:\033[$attrib;${color}mhi, dudes\033[m"
  done
done

Tiene inconvenientes importantes ya que el uso de este funciona:

$ dmesg | hilight \\[ 34 ] 34

pero esto en absoluto:

$ dmesg | hilight \\[ 34 ] 34 [[:digit:]] 31

porque [: dígito:] encuentra los números en las secuencias de escape en las sustituciones anteriores.

Algo como:

$ cat /var/log/kern.log | hilight kernel 31 a 34 et 33

siempre funcionará como salvo.

Usando el comando de tiempo, encontré que esto aumenta en cuatro el tiempo transcurrido, que no es demasiado.

Puede reemplazar el comando sed con cualquier otro analizador que desee o que se ajuste a sus necesidades (awk, etc.)

nenopera
fuente
2

También se puede usar egrep con un patrón que coincida con cada línea en caracteres no imprimibles, como:

dmesg | egrep --color "swap|$"
Michal Sylwester
fuente
1

Clide funciona bien. Lo uso en RHEL 6.2, desde el repositorio EPEL

golimar
fuente
+1 para una herramienta muy buena. Desafortunadamente no tiene todas las características solicitadas.
l0b0
1

Si su versión de grepviene con coloración, puede usar la alteración regexp para hacer que grep resalte el texto y también coincida con cada línea para que no se excluya nada. Lo siguiente debería hacer el truco:

<your command> |grep "highlightme\|^"
EoghanM
fuente
0

Como mencionó en el enlace, grep --color=alwayssolo funciona para un patrón. Dicho esto, no creo que exista tal herramienta.

Frederik Deweerdt
fuente
0

Yo uso http://em.readthedocs.org/ . Fácil de instalar en varias plataformas gracias a Python. Simple y funciona bien.

ikalnitsky
fuente
¡Bienvenido a Unix & Linux Stack Exchange! Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
slm
1
Según el centro de ayuda : "Sin embargo, debe divulgar su afiliación en sus respuestas". En caso de que sea el mismo Igor Kalnitsky que escribió em, modifique su respuesta para dejar en claro que no es un usuario, sino el autor de la herramienta sugerida.
manatwork