¿Cómo puedo resaltar coincidencias con GNU grep?

18

He visto en algunos Linux, que grepestá configurado para resaltar la coincidencia e imprimir el archivo coincidente.

¿Cómo puedo configurar greppara resaltar coincidencias?

elmarco
fuente

Respuestas:

10
alias cgrep='grep -nR --color'

Uso:

$ cgrep somestring /path/to/dir/or/file/with*/possible/*wild.card

También uno de mis favoritos:

$ pgrep some-hanging-process

enumerará todos los pids de procesos que coinciden con el nombre de algún proceso que puede usar en la siguiente situación:

$ kill $(pgrep some-hanging-process)
Eimantas
fuente
12
hay un comando pkill para el último
diega
1
Con las versiones recientes de GNU grep, grep -rgeneralmente se debe preferir a grep -Rlas anteriores, ya que la primera no atraviesa enlaces simbólicos.
Stéphane Chazelas
19

He descubierto que la mejor manera de pimp grep es usar ack , que es esencialmente grep recursivo con una lista inteligente de ignorar (por ejemplo, no busca directorios .svn, ignora archivos de copia de seguridad, etc.), resaltando los resultados en color y perl regexps. Es lo que quieres que haga grep el 98,6% del tiempo.

Kai
fuente
55
+1 por mencionar ack. No olvide incluir la opción --pager = "less -R" para mantener el resaltado para resultados paginados. También vale la pena mencionar que en Ubuntu, se conoce como "ack-grep" ya que se toma "ack".
Shawn Chin
Puedo utilizar ACK también, pero en algún momento que no lo tiene disponible ..
Elmarco
2
Dado que ack es solo un script perl, puede hacerlo disponible en cualquier lugar donde tenga instalado perl, lo que no es una barra alta.
Kai
Ack es bueno por sus valores predeterminados, pero en el tiempo que le lleva instalar ack, podría haber configurado algunos valores predeterminados para grep; vea mi respuesta en otra parte de esta página. Lo hice una vez en la década de 1980, y desde entonces grep ha hecho todo lo que hace ack. (solo grep es realmente más rápido, a pesar de las fuertes afirmaciones de lo contrario de ack)
Jonathan Hartley
7

Configuré esto en mi .bashrc, en lugar de redefinir grep usando un alias:

    export GREP_OPTIONS="--color=auto"

Para mí, esto funciona en Linux, MacOSX y FreeBSD.

Stefan Lasiewski
fuente
GREP_OPTIONSdebe considerarse dañino Recomiendo usar aliasen su lugar. Ver aquí: bugs.launchpad.net/ubuntu/+bug/67141
lesmana
Estoy de acuerdo en que GREP_OPTIONS puede ser un problema en ciertos scripts. Pero como dije en el error 67141 , GREP_OPTIONS permite al usuario establecer una opción para muchas formas de grep (grep, egrep, fgrep, rgrep, zgrep, bzgrep, bzfgrep, bzegrep, etc.), mientras que será necesario establecer un alias para cada forma de * grep, y hay muchos tipos de grep.
Stefan Lasiewski
Solía ​​usar GREP_OPTIONS durante años (es decir, décadas), pero el daño que causa es muy real. Cualquier herramienta que invoque grep con este conjunto var var heredará su comportamiento predeterminado modificado, y esto romperá esas herramientas. Evite este problema por completo definiendo un alias o una secuencia de comandos ejecutable de contenedor en su lugar.
Jonathan Hartley
Los guiones deben desinfectar su entorno. No se permiten peros ni peros. Período. (Sí, es un dolor real en la espalda baja ...).
vonbrand
3

Recomiendo evitar la variable de entorno GREP_OPTIONS, afectará cada invocación de grep, incluso aquellas integradas en otras herramientas. Si esas herramientas esperan que grep se comporte de una manera, y usted cambia ese comportamiento, las romperá y las romperá.

En su lugar, puede crear un alias, que funciona bien. Esto solo afectará las llamadas a grep desde su shell interactivo (es decir, que escriba usted mismo).

La última opción, que me gusta más que nada, es crear un script de envoltura que invoque grep. Prefiero esto sobre un alias, porque puedo invocar este contenedor desde otros programas. Por ejemplo, en vim configurando vimgrep, de modo que mis búsquedas desde vim se comporten de manera idéntica a las búsquedas en la línea de comandos.

$ cat `which grp`
#!/usr/bin/env bash
grep -rI --color --exclude-dir=\.bzr --exclude-dir=\.git --exclude-dir=\.hg --exclude-dir=\.svn --exclude-dir=build --exclude-dir=dist --exclude=tags $*

Invoque esto usando:

$ grp pattern dir

p.ej

$ grp pattern .

buscará instancias de 'patrón' en todos los archivos de texto en el directorio actual y subdirecciones.

Tenga en cuenta que llamo a mi script 'grp', en lugar de sombrear 'grep', para que siempre esté al tanto de si invoco grep con mis valores predeterminados personalizados o no.

Por defecto incluyo:

-r : search subdirs recursive
-I : skip binary files
--color : highlight matches in color
--exclude-dir : skip specified directories and their subdirs
--exclude : skip specified files

Creo que todos querrían omitir los directorios de control de código fuente: .hg .git .bzr .svn

Omitir 'build' y 'dist' son Python-isms, y probablemente no se aplican a la mayoría de las personas. Sin duda, desarrollará sus propias idiosincrasias mientras trabaja.

'tags' es el resultado de ctags, que uso para 'ir a la definición de funciones' y similares en herramientas como vim. Como tal, contiene al menos una copia de cada palabra y símbolo de mi código fuente, por lo que vale la pena saltarse los resultados de búsqueda.

"$ *" al final es la sintaxis de bash para "y todos los demás parámetros de la línea de comandos", por lo que puede pasar el patrón y el directorio para buscar normalmente, y anular cualquier otra marca de línea de comando que desee .

Jonathan Hartley
fuente
2

La --coloropción ya se ha mencionado varias veces, pero me gustaría agregar que es posible configurar el color en el que se resaltarán las coincidencias utilizando una variable de entorno

export GREP_COLOR="1;33"

El color debe codificarse utilizando códigos de color ANSI, como referencia

Black       0;30     Dark Gray     1;30
Blue        0;34     Light Blue    1;34
Green       0;32     Light Green   1;32
Cyan        0;36     Light Cyan    1;36
Red         0;31     Light Red     1;31
Purple      0;35     Light Purple  1;35
Brown       0;33     Yellow        1;33
Light Gray  0;37     White         1;37
Adam Byrtek
fuente
1
GREP_COLORes obsoleto. Usar en su GREP_COLORSlugar.
g33kz0r
2

Como no vi ningún ejemplo de configuración de colores, aquí hay una configuración simple para GNU grep:

# turn on colors, natch.
export GREP_OPTIONS="--color=auto"

if [[ $(echotc Co) -ge 256 ]]; then
  # 256 color terminals
  export GREP_COLORS="mt=38;5;118:sl=:cx=:fn=38;5;18:ln=1;30:bn=37:se=30"
else
  # everybody else
  export GREP_COLORS="mt=31:sl=:cx=:fn=34:ln=1;30:bn=30:se=30"
fi

Ten cuidado con GREP_OPTIONS; no lo use para otra cosa que no sea cosas --color=autoo dañará cualquier script que use grep en su sistema.

docwhat
fuente