Androide

Comando grep en linux (buscar texto en archivos)

Buscar desde la terminal con grep

Buscar desde la terminal con grep

Tabla de contenido:

Anonim

El comando grep que significa "impresión de expresión regular global" es uno de los comandos más potentes y comúnmente utilizados en Linux.

Grep busca en uno o más archivos de entrada líneas que coincidan con un patrón determinado y escribe cada línea coincidente en la salida estándar. Si no se especifican archivos, grep lee la entrada estándar, que generalmente es la salida de otro comando.

En este tutorial, le mostraremos cómo usar el comando grep través de ejemplos prácticos y explicaciones detalladas de las opciones grep más comunes de GNU.

Sintaxis del comando Grep

Antes de comenzar a usar el comando grep , comencemos por revisar la sintaxis básica.

Las expresiones de utilidad grep toman la siguiente forma:

grep PATTERN

Los artículos entre corchetes son opcionales.

  • OPTIONS : cero o más opciones. Grep proporciona una serie de opciones que controlan su comportamiento. PATTERN - Patrón de búsqueda. FILE : cero o más nombres de archivo de entrada.

Para poder buscar el archivo, el usuario que ejecuta el comando debe tener acceso de lectura al archivo.

Cómo usar grep para buscar una cadena en archivos

El uso más básico del comando grep es buscar una cadena (texto) en un archivo.

Por ejemplo, para mostrar las líneas del /etc/passwd que contiene la cadena bash , puede usar el siguiente comando:

grep bash /etc/passwd

La salida debería verse así:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Si la cadena incluye espacios, debe encerrarla entre comillas simples o dobles:

grep "Gnome Display Manager" /etc/passwd

Invertir partido (Excluir)

Para mostrar las líneas que no coinciden con un patrón, use la opción -v (o --invert-match ).

Por ejemplo, para mostrar las líneas del /etc/passwd que no contienen la cadena nologin , puede usar el siguiente comando:

grep -v nologin /etc/passwd

root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Cómo usar Grep para buscar una cadena en la salida del comando

En lugar de especificar archivos de entrada, puede canalizar la salida de otro comando a grep , y luego mostrar solo líneas que coincidan con un patrón dado.

Por ejemplo, para averiguar qué procesos se están ejecutando en su sistema como usuario www-data , puede usar el siguiente comando ps :

ps -ef | grep www-data

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

También puede encadenar varias tuberías en el comando. Como puede ver en el resultado anterior, también hay una línea que contiene el proceso grep . Si no desea que se muestre esa línea, pase la salida a otra instancia grep como se muestra a continuación.

ps -ef | grep www-data | grep -v grep

www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process

Búsqueda recursiva

Para buscar un patrón de forma recursiva, use la opción -r (o --recursive ). Esto buscará en todos los archivos en el directorio especificado, omitiendo los enlaces simbólicos que se encuentran de forma recursiva. Para seguir todos los enlaces simbólicos, use la opción -R (o --dereference-recursive ).

En el siguiente ejemplo, estamos buscando la cadena linuxize.com en todos los archivos dentro del directorio /etc :

grep -r linuxize.com /etc

El comando imprimirá las líneas coincidentes con el prefijo de la ruta completa al archivo.

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;

Si en su lugar -r usa la opción -R , grep seguirá todos los enlaces simbólicos:

grep -R linuxize.com /etc

Observe la última línea de la salida. Esa línea no se imprime en el ejemplo anterior porque los archivos dentro del directorio sites-enabled para sites-enabled de Nginx son enlaces simbólicos a archivos de configuración dentro del directorio sites-available .

/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;

Mostrar solo el nombre del archivo

Para suprimir la salida grep predeterminada e imprimir solo los nombres de los archivos que contienen el patrón coincidente, puede usar la opción -l (o --files-with-matches ).

Por ejemplo, para buscar en todos los archivos que terminan en .conf en el directorio de trabajo actual e imprimir solo los nombres de los archivos que contienen el tipo de cadena linuxize.com :

grep -l linuxize.com *.conf

La salida se verá más o menos así:

tmux.conf haproxy.conf

La opción -l generalmente se usa en combinación con la opción recursiva -R :

grep -Rl linuxize.com /tmp

Búsqueda insensible a mayúsculas y minúsculas

Por defecto, el comando grep mayúsculas y minúsculas. Esto significa que los caracteres en mayúscula y minúscula se tratan como distintos.

Para ignorar mayúsculas y minúsculas al buscar, use la opción -i (o --ignore-case ).

Por ejemplo, al buscar Zebra sin ninguna opción, el siguiente comando no mostrará ningún resultado, es decir, hay líneas coincidentes:

grep Zebra /usr/share/words

Pero si realiza una búsqueda sin distinción entre mayúsculas y minúsculas utilizando la opción -i , coincidirá con letras mayúsculas y minúsculas:

grep -i Zebra /usr/share/words

Especificar "Zebra" coincidirá con "zebra", "ZEbrA" o cualquier otra combinación de letras mayúsculas y minúsculas para esa cadena.

zebra zebra's zebras

Buscar palabras completas

Al buscar "gnu", grep también imprimirá las líneas donde "gnu" está incrustado en palabras más grandes, como "cygnus" o "magnum".

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Para devolver solo aquellas líneas donde la cadena especificada es una palabra completa (encerrada por caracteres que no son palabras), use la opción -w (o --word-regexp ).

Los caracteres de palabras incluyen caracteres alfanuméricos ( az , AZ y 0-9 ) y guiones bajos ( _ ). Todos los demás caracteres se consideran caracteres que no son palabras.

grep -w gnu /usr/share/words

gnu

Mostrar números de línea

Para mostrar el número de líneas que contienen una cadena que coincide con un patrón, use la opción -n (o --line-number ). Al usar esta opción, grep imprimirá las coincidencias a la salida estándar con el prefijo del número de línea en el que se encontró.

Por ejemplo, para mostrar las líneas del /etc/services que contiene la cadena bash con el número de línea correspondiente, puede usar el siguiente comando:

grep -n 10000 /etc/services

El resultado a continuación nos muestra que las coincidencias se encuentran en las líneas 10423 y 10424.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Contar partidos

Para imprimir un recuento de líneas coincidentes con la salida estándar, use la opción -c (o --count ).

En el siguiente ejemplo, estamos contando el número de cuentas que tienen /usr/bin/zsh como shell.

grep -c '/usr/bin/zsh' /etc/passwd

4

Buscar varias cadenas (patrones)

Se pueden unir dos o más patrones de búsqueda utilizando el operador OR | .

Por defecto, grep interpreta el patrón como una expresión regular básica donde los metacaracteres como | pierden su significado especial, y deben usarse sus versiones reducidas.

En el siguiente ejemplo, estamos buscando todas las apariciones de las palabras fatal , error y critical en el archivo de error de registro de Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Modo silencioso

El -q (o --quiet ) le dice a grep que no escriba nada en el terminal (salida estándar). Si se encuentra una coincidencia, el comando saldrá con el estado 0 . Esto es útil cuando se usa grep en los scripts de shell donde desea verificar si un archivo contiene una cadena y realizar una determinada acción dependiendo del resultado.

Aquí hay un ejemplo del uso de grep en modo silencioso como comando de prueba en una instrucción if :

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Expresión regular básica

GNU Grep tiene dos conjuntos de características de expresión regular, Básico y Extendido. Por defecto, grep interpreta el patrón como una expresión regular básica.

Cuando se usa en el modo básico de expresión regular, todos los demás caracteres, excepto los metacaracteres, son en realidad expresiones regulares que coinciden entre sí. A continuación se muestra una lista de los metacaracteres más utilizados:

  • Use el símbolo ^ (caret) para hacer coincidir la expresión al comienzo de una línea. En el siguiente ejemplo, la cadena ^kangaroo coincidirá solo si ocurre al comienzo de una línea.

    grep "^kangaroo" file.txt

    Use el símbolo $ (dólar) para hacer coincidir la expresión al final de una línea. En el siguiente ejemplo, la cadena kangaroo$ solo coincidirá si ocurre al final de una línea.

    grep "kangaroo$" file.txt

    Usa el . (punto) símbolo para que coincida con cualquier carácter individual. Por ejemplo, para hacer coincidir cualquier cosa que comience con kan luego tenga dos caracteres y termine con el string roo , puede usar el siguiente patrón:

    grep "kan..roo" file.txt

    Utilizar (corchetes) para que coincida con cualquier carácter encerrado entre corchetes. Por ejemplo, si encuentra las líneas que contienen accept o " accent ", puede usar el siguiente patrón:

    grep "accet" file.txt

    Utilizar (corchetes) para que coincida con cualquier carácter encerrado entre corchetes. El siguiente patrón coincidirá con cualquier combinación de cadenas que contengan co(any_letter_except_l)a , como coca , cobalt , etc., pero no coincidirá con las líneas que contienen cola , grep "coa" file.txt

Para escapar del significado especial del siguiente carácter, use el símbolo \ (barra invertida).

Expresiones regulares extendidas

Para interpretar el patrón como una expresión regular extendida, use la opción -E (o --extended-regexp ). Las expresiones regulares extendidas incluyen todos los metacaracteres básicos, junto con metacaracteres adicionales para crear patrones de búsqueda más complejos y potentes. A continuación hay algunos ejemplos:

  • Haga coincidir y extraer todas las direcciones de correo electrónico de un archivo dado:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Haga coincidir y extraiga todas las direcciones IP válidas de un archivo determinado:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

La opción -o se usa para imprimir solo la cadena coincidente.

Imprimir líneas antes de un partido

Para imprimir un número específico de líneas antes de las líneas coincidentes, use la opción -B (o --before-context ).

Por ejemplo, para mostrar cinco líneas de contexto principal antes de las líneas coincidentes, usaría el siguiente comando:

grep -B 5 root /etc/passwd

Imprimir líneas después de un partido

Para imprimir un número específico de líneas después de las líneas coincidentes, use la opción -A (o --after-context ).

Por ejemplo, para mostrar cinco líneas de contexto final después de las líneas coincidentes, usaría el siguiente comando:

grep -A 5 root /etc/passwd

Conclusión

El comando grep permite buscar un patrón dentro de los archivos. Si se encuentra una coincidencia, grep imprimirá las líneas que contienen el patrón especificado.

Hay mucho más que aprender sobre Grep en la página del Manual del usuario de Grep.

terminal grep