
En bash, si quiero ejecutar un comando y mostrar solo líneas de salida que coincidan con un patrón determinado, puedo canalizarlo a grep
, como
archivo de prueba
hello
there
my
friends
dominio
$ cat testfile | grep 'hello'
hello #this will be highlightd
esto resaltará la coincidencia de búsqueda y mostrará la línea completa en la que se encuentra. Puedo usar -A
y -B
para mostrar líneas antes y después de esa línea. Mi pregunta es: ¿es posible ejecutar el comando y mostrar todos los resultados normalmente, pero resaltar las coincidencias de búsqueda como lo haría grep? entonces mi salida sería
hello #highlighted
there
my
friends
Respuesta1
Para utilizar un GREP de color para resaltar solo patrones coincidentes pero no cambiar la salida:
grep --color=always -e "^" -e "hello" testfile
El primer patrón coincidirá con todas las líneas (se imprimirán todas las líneas); el segundo patrón (y cualquier patrón siguiente) hará que el texto coincidente se resalte en color.
Dado que el primer patrón coincide con todas las líneas pero no coincide con un carácter imprimible, no agrega ningún resaltado de color, por lo que no compite ni interfiere con la legibilidad del texto resaltado.
Respuesta2
Agregue una opción -z
a su comando grep de GNU:
cat testfile | grep --color=always -z 'hello'
o más corto
grep --color=always -z 'hello' testfile
Respuesta3
Éste funciona tanto con GNU grep como con grep en FreeBSD:
grep --color=always 'hello\|$'
Coincide con el texto "hola" o ( \|
) la cadena nula no imprimible al final de cada línea ( $
). Es por eso que cada línea se imprime pero solo se resalta "hola".
Lo más probable es que ya lo haya --color=auto
configurado en su shell. Entonces lo más probable es que no necesites especificar --color=always
:
grep 'hello\|$'
También puede usar una versión más simple egrep
(con expresiones regulares extendidas), donde |
no es necesario escapar la expresión "o":
egrep 'hello|$'
Vea también una pregunta similar en StackOverflow:grep coloreado: visualización del archivo completo con coincidencias resaltadas
Respuesta4
Aquí hay una solución que utiliza ripgrep
, un reemplazo moderno, más fácil de usar (IMO) y mucho más rápido para grep
:
cat my-file | rg --passthru '<REGEX>'
También puedes personalizar fácilmente el "color del resaltador":
# dark red foreground with light yellow background:
cat my-file | rg --passthru --colors match:fg:124 --colors match:bg:229 '<REGEX>'
Ver man rg
(versión en línea).
Para el uso diario creé un alias de shell:
# in .bashrc
alias hl='rg --passthru --colors match:fg:124 --colors match:bg:229'
Ahora es tan simple como cat my-file | hl '<REGEX>'
.