Resalte la salida de búsqueda de la consola, mientras muestra la salida completa del comando


19

Cuando uso, por ejemplo cat file.txt | grep --color=tty "pattern", aparece el patrón que busco resaltado. Cuando quiero algo más de contexto en torno a cada golpe, grep tiene las -A, -By los -Cparámetros.

Sin embargo, quiero mostrar todo el archivo (o cualquier salida de comando) y resaltar un cierto patrón. ¿Existe tal comando o herramienta de resaltado?


¿Cómo es lo que quieres hacer ahora diferente de lo que ya haces?
Benjamin Bannier

Respuestas:


22

Hubo una respuesta en unix.stackexchange.com que tenía este ingenioso truco:

grep -E --color 'pattern|$' file.txt

o

grep --color 'pattern\|$' file.txt

que coincide con su patrón o el final de línea en cada línea. Solo se resalta el patrón.


+1 Simple y fácilmente adaptable a zgrep, bzgrep, etc. ¡Agradable!
Stefan Lasiewski,

¿Hay alguna forma de evitar escribir --color todo el tiempo? Creo que es bastante básico incrustar la opción de color en grep, no estoy seguro de por qué hemos escrito explícitamente el color cada vez. Intenté crear scripts que digan que los archivos grepd tienen un bash que dice grep --color $ 1 $ 2 pero no funciona. Cualquier pista aquí para arreglar esto, por favor
Srujan Kumar Gulla

1
@lordlupine: agregue GREP_OPTIONS='--color'a su ~/.bashrc(o modifique la configuración para incluir --color). Deberá iniciar un nuevo terminal o ejecutar esa asignación en la línea de comando en el terminal actual para que surta efecto.
Pausado hasta nuevo aviso.

9

Me gusta ACK .

ack --passthru somepattern filename

Es como grep, pero mejor. Se resalta de manera predeterminada, y con la --passthruopción muestra todo el archivo (o entrada estándar) en lugar de solo las líneas coincidentes.


1
Si está tratando de canalizar la salida a ack, por ejemplo tail, desde , entonces también necesita usar la --filteropción. Por ejemplo:tail -f myLogFile | ack --filter --passthru pattern
gorrión

5

También recomiendo el uso de less(o tal), pero quiero mostrarle una solución más didáctica. Una vez que haya definido esta función:

función resaltada ()
{
    sed "s / $ 1 /` tput smso` & `tput rmso` / g" "$ {2: -}"
}

Puedes usarlo de esta manera:

command | highlight pattern
highlight pattern file.txt

Nota: Esta versión distingue entre mayúsculas y minúsculas, para cambiar eso que se agrega idespués gen la sedexpresión.


1
Yo invoco tputen lugar de codificar los valores. De esta manera también evita usar echo -e, lo que puede tener otros efectos.
Ignacio Vazquez-Abrams

Tienes toda la razón, lo busqué sin suerte. Gracias.
cYrus

Esta versión no necesita los paréntesis de captura y puede ejecutarse por prog | highlight "pattern"o highlight "pattern" file:highlight () { local file=${2:--}; sed "s/$1/$(tput smso)&$(tput rmso)/gi" "$file"; }
pausa hasta nuevo aviso.

Mis sedhabilidades básicamente no existen. ¿Cómo tendría que cambiar eso para que coincida con el patrón de mayúsculas y minúsculas? De todos modos, lo agregaré a mi bash_functions include. Muchas gracias.
DerMike

@DerMike: ahora es sensible a mayúsculas y minúsculas.
cYrus

3

Pasar -Ca grepcon un valor suficientemente alto hará esto.


Podría haber jurado que obtuve algo más la última vez que lo intenté. (Cada uno coincide con el contexto con separadores '-----' en el medio.) Ahora que me lo dijiste, funciona bien :-) Gracias.
DerMike

Separará cada partido, si no hay suficiente contexto.
Ignacio Vazquez-Abrams

3

less está resaltando el patrón, entonces

less -p 'mypattern' file.txt

o

ridiculously | long | pipe | less

y luego en menos /para buscar un patrón que se resaltará.

Nota al margen:

Puede mejorar su comando, por ejemplo,
establecer un alias alias grep="grep --color=tty"y usarlo así:

grep 'mypattern' file.txt;

1
debes abstenerte de usar GREP_OPTIONS, usa alias en su lugar. ver: bugs.launchpad.net/ubuntu/+bug/67141
lesmana

Primum non nocere. remoto.
Codificador informal el

GREP_OPTIONS es usado por muchas formas de grep(zgrep, bzgrep, bzfgrep, etc.) Entonces, si desea que todas las formas de grep se comporten de manera consistente, necesitará establecer un alias para cada forma de grep. La nueva respuesta de @ Casual anterior no servirá para algo así bzgrep pattern /var/log/messages.?.gz, que es un ejemplo en el que el resaltado de color será MUY útil.
Stefan Lasiewski

1

Hay una buena herramienta de supercat , que sirve exactamente para ese propósito. Puede colorear la salida de su consola y producir un html "resaltado" a partir de su entrada.


Gracias, eso parece prometedor. Sin embargo, parece que no puedo hacerlo funcionar en este momento.
DerMike

1
Eche un vistazo a sus archivos de configuración (en /etc/supercatUbuntu), que configuran las reglas de coloración, básicamente son pares de colores / expresiones regulares (con algunas reglas adicionales); La página de manual también es corta y agradable.
Ivan Tarasov

Encontré un spcrcarchivo de sintaxis vim en vim.org/scripts/script.php?script_id=2676
DerMike
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.