grep: muestra todos los resultados pero resalta las coincidencias de búsqueda

39

en bash, si quiero ejecutar un comando y solo mostrar líneas de salida que coinciden con un cierto patrón, puedo canalizarlo grep, como

archivo de prueba

hello
there
my
friends

mando

$ 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 -Ay -Bpara mostrar líneas antes y después de esa línea. Mi pregunta es si es posible ejecutar el comando y mostrar todos los resultados de forma normal, pero para resaltar las coincidencias de búsqueda como lo haría grep. entonces mi salida sería

hello #highlighted
there
my
friends
ewok
fuente
3
Consulte Convencer a grep para generar todas las líneas, no solo aquellas con coincidencias (U&L) o Colorized grep: ver el archivo completo con coincidencias resaltadas (Desbordamiento de pila) para obtener mejores respuestas.
G-Man dice 'Reincorporar a Monica'

Respuestas:

38

Para usar un Color GREP para resaltar solo patrones coincidentes pero no cambiar la salida de otra manera:

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 los siguientes patrones) harán que el texto coincidente se destaque en color.

Dado que el primer patrón coincide con todas las líneas pero no con un carácter imprimible, no agrega ningún resaltado de color, por lo que no compite / interfiere con la legibilidad del texto resaltado.

bot779
fuente
Funciona con kubectl kubectl apply -k . | grep --color=always -e "^" -e "configured"en zsh
Michael Cole
Para usar en Bash: highlight () {grep --color = always -e "^" -e $ *; }
Jon
Esto también funciona en FreeBSD, solo necesita intercambiar el primer y el segundo patrón ( "^"debe ser el segundo).
Marián Černý
25

Agregue la opción -za su comando grep de GNU:

cat testfile | grep --color=always -z 'hello'

o más corto

grep --color=always -z 'hello' testfile
Ciro
fuente
3
Este es un truco muy crudo. Tiene el efecto de tratar todo el archivo como una sola línea. Por lo tanto, (1) si el archivo es muy grande, puede haber una posibilidad de quedarse sin memoria, y (2) si el archivo no contiene el patrón en absoluto , entonces nada tendrá salida.
G-Man dice 'reinstalar a Monica'
¿En qué versión de grep es compatible? En grep 2.5.4, -z no parece estar disponible ...
Alex
@Alex: utilicé GNU grep versión 2.6.3.
Cyrus
2
@ G-Man: más ahorro de recursos:grep --color "hello\|$" file
Cyrus
@ Cyrus: Sí, esa es una mejor respuesta. Desafortunadamente, es esencialmente equivalente a la respuesta de bot779 a esta pregunta, y casi idéntico a las respuestas aceptadas ( 1 y 2 ) a las preguntas a las que me vinculé.
G-Man dice 'Restablece a Mónica'
4

De manera similar a la respuesta anterior, puede capturar todos los $extremos de las líneas:

cat testfile | grep --color -E "hello|$"

-E(o --extended-regexp) significa que se debe escapar con caracteres especiales \. Al usarlo, |se tratará como una condición regex "OR".

Grep |$también capturará e imprimirá todas las líneas que tengan un final, pero como $ es un carácter oculto, no se puede resaltar.

Actualizar:

Si desea imprimir toda la salida, pero también devolver el código de salida , ya sea que se haya encontrado una coincidencia o no, puede usar el comando perl:

cat testfile | \
perl -pe 'BEGIN {$status=1} END {exit $status} $status=0 if /hello/;'

Si prefiere sed : aquí hay un ejemplo de cómo resaltar todas las coincidencias + devolver el código de salida si no se encuentra ninguna coincidencia: https://askubuntu.com/a/1200851/670392

Noam Manos
fuente
2

Este funciona con GNU grep, así 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".

Es probable que ya haya --color=autoconfigurado en su shell. Entonces lo más probable es que no necesite especificar --color=always:

grep 'hello\|$'

También puede usar una versión más simple usando egrep(con expresiones regulares extendidas), donde |para la expresión "o" no es necesario escapar:

egrep 'hello|$'
Marián Černý
fuente
Esto no responde cómo mostrar todas las líneas de entrada.
Chris Página
@ChrisPage Diría que sí: es por eso que cada línea se imprime pero solo se resalta "hola".
Marián Černý
0

Agregando a la respuesta superior de arriba. La función resaltar {} mencionada en los comentarios solo funciona cuando se ingresan datos. El siguiente alias, aunque no es perfecto, es más útil:

alias greph="grep --color=always -e^ -e"

Esto funciona con comandos como:

greph foo bar.txt

cat bar.txt | greph foo
rpmohn
fuente