Digamos que tengo el siguiente archivo:
$ cat test
test line 1
test line 2
line without the search word
another line without it
test line 3 with two test words
test line 4
Por defecto, grep
devuelve cada línea que contiene el término de búsqueda:
$ grep test test
test line 1
test line 2
test line 3 with two test words
test line 4
Pasar el --color
parámetro a grep
lo hará resaltar la parte de la línea que coincide con la expresión de búsqueda, pero aún así solo devuelve líneas que contienen la expresión. ¿Hay alguna manera de obtener la grep
salida de cada línea en el archivo fuente, pero resaltar las coincidencias?
Mi truco terrible actual para lograr esto (al menos en archivos que no tienen más de 10000 líneas consecutivas sin coincidencias) es:
$ grep -B 9999 -A 9999 test test
Si grep
no puede lograr esto, ¿hay otra herramienta de línea de comandos que ofrezca la misma funcionalidad? He jugado con él ack
, pero tampoco parece tener una opción para ello.
grep
highlighting
Michael Mrozek
fuente
fuente
-C 9999
en lugar de-A 9999 -B 9999
.Siempre hago:grep -C 9999 pattern file
Respuestas:
Lo que estamos haciendo aquí es hacer coincidir el
$
patrón y el patrón de prueba, obviamente$
no tiene nada que colorear, por lo que solo el patrón de prueba adquiere color. El-E
solo activa la coincidencia de expresiones regulares extendida.Puede crear una función fácilmente de esta manera:
fuente
highlight () { grep --color -E "$1|$" $2 ; }
. Uso:highlight test yourfile
"$2"
también debería ser citado.highlight () { grep --color -E "$1|$" "$@" }
que permite archivos con espacios en blanco en sus nombres y múltiples archivos."$1"
en los archivos. Usohighlight () { grep --color -E "$1|$" "${@:1}" }
para Ubuntu y Debian, use ack-grep en lugar de ack
fuente
--regexp string
; el equivalente ack / ack-grep es--match string
ack --passthru
con perl:grep_passthrough () { ! perl -ne "print; \$e ||= /$@/; END{{exit \$e}}"; }
ack --passthru
¡También funciona en transmisiones! Por ejemplo,ifconfig | ack --passthru inet
Otra forma de hacer esto correctamente y de forma portátil con
grep
(además de usar dos expresiones regulares con la alternancia como en la respuesta aceptada) es a través del modelo nulo (y la cadena, respectivamente nulo).Debería funcionar igualmente bien con ambos
-E
y con los-F
interruptores ya que, según el estándar :y
Entonces es simplemente una cuestión de correr
y respectivamente
fuente
grep -F -e '' -e 'string'
.seq 3 | grep -F -e '' -e 2
solo produce 2 en 2.27 (y 2.26, pero no 2.25, y no en la cabeza de git). Solo con-F
(no sin o con -E). IOW, solo 2.26 y 2.27 parecen tener el error y solo con -F.seq 3 | grep -F -e '' -e '' -e 2
parece funcionar también con 2.27-F
, aliviando la necesidad de preocuparse por los personajes que aparecenstring
. Es posible que desee mencionar--color
; A medida que esta respuesta aparece en la página (cuando se ve por votos), más personas pueden terminar leyéndola antes que las otras respuestas.Tengo la siguiente función que uso para tales cosas:
Internamente se ve un poco feo, es agradable y fácil de usar, así:
o, para un ejemplo un poco más real:
Puede cambiar los colores a lo que quiera (lo que podría ser difícil con grep, no estoy seguro) cambiando los
1
y31
y43
(después\e[
) a diferentes valores. Los códigos a utilizar son todo sobre el lugar , pero aquí es una introducción rápida: 1 negritas el texto, la31
hace que sea rojo, y la43
da un fondo amarillo.32
o33
serían diferentes colores, y44
o45
serían diferentes orígenes: se entiende la idea. Incluso puede hacer que parpadee (con un5
) si está tan inclinado.Esto no utiliza ningún módulo especial de Perl, y Perl es casi omnipresente, por lo que esperaría que funcione en casi cualquier lugar. La solución grep es muy inteligente, pero el interruptor --color en grep no está disponible en todas partes. Por ejemplo, acabo de probar esta solución en una caja de Solaris que ejecuta bash, y otra que ejecuta ksh, y mi máquina Mac OS X local ejecuta zsh. Todo funcionó bien.
grep --color
Sin embargo, Solaris se atragantó con la solución.Además, ack es increíble, y lo recomiendo a cualquiera que aún no lo haya descubierto, pero he tenido algunos problemas para instalarlo en algunos de los muchos servidores en los que trabajo. (Olvidé por qué: creo que relacionado con los módulos de Perl requería).
Como creo que nunca he trabajado en una caja de Unix que no tenía instalado Perl (con la excepción de los sistemas de tipo embebido, enrutadores Linksys, etc.), diría que esta es una solución prácticamente universal. .
fuente
En lugar de usar Grep, puede usar Less:
Buscar así:
/pattern
EnterEsta voluntad:
Para desplazarse a la siguiente línea coincidente:
n
Para desplazarse a la línea coincidente anterior:
N
Para alternar el resaltado: Esc
u
También puede cambiar el color de resaltado si lo desea.
fuente
Puedes probar:
Sin embargo, no es muy portátil, e incluso si Perl está instalado, es posible que deba descargar otro módulo. Además, coloreará toda la línea, no solo la palabra de búsqueda.
fuente
ripgrep
Usar
ripgrep
con su--passthru
parámetro:Es una de las herramientas de grepping más rápidas , ya que está construida sobre el motor regex de Rust que utiliza autómatas finitos, SIMD y optimizaciones literales agresivas para que la búsqueda sea muy rápida.
fuente
Hay una manera mucho más fácil de hacer esto para GNU grep, pero no creo que sea portátil (es decir, BSD grep):
En una pipa:
cat <file> | grep --color=always -z <query>
En un archivo:
grep --color=always -z <query> <file>
El crédito va a la respuesta de Cyrus aquí .
fuente
--color
tampoco es estándar .)Ninguna de las respuestas dadas hasta ahora proporciona una solución portátil .
Aquí es un portátil de 1 función de shell que ya se envió en un lugar cerrado como cuestión duplicado que no requiere herramientas no estándar o extensiones no estándar provistos de
perl
,ack
,ggrep
,gsed
,bash
y los gustos, pero sólo necesita un shell POSIX y los servicios públicos obligatorios POSIXsed
yprintf
:Puedes usarlo de esa manera:
El color de resaltado se puede ajustar mediante el uso de uno de estos códigos en el argumento del comando sed (32m es verde aquí):
1 Siempre que su terminal admita secuencias de escape de colores ANSI.
fuente
Una
sed
versión, funciona en ambosbash
yash
.fuente
OP solicitó
grep
, y eso es lo que RECOMIENDO ; pero después de intentar resolver un problema consed
, para el registro, aquí hay una solución simple:o
Pintará
main
en rojo.\E[31m
: secuencia de inicio de color rojo\E[0m
: marca de color terminada&
: el patrón combinado/g
: todas las palabras en una línea, no solo la primera$'string'
Se interpretan cadenas bash con caracteres escapadosEn cuanto a grep , también funciona usando
^
(inicio de línea) en lugar de$
(final de línea). Ejemplo:Y solo para mostrar este alias loco que NO RECOMIENDO , incluso puede dejar las citas abiertas:
¡todo el trabajo! :) No se preocupe si olvida cerrar la cita, bash lo recordará con un "carácter de línea continua".
fuente