Linux en Español

Comando Grep en Linux (con ejemplos)

En este tutorial, aprenderá a utilizar el muy esencial comando grep en Linux. Vamos a repasar por qué es importante dominar este comando y cómo puede utilizarlo en sus tareas diarias en la línea de comandos.

Vamos a sumergirnos con algunas explicaciones y ejemplos.


 

 

¿Por qué usamos el grep?

Grep es una herramienta de línea de comandos que los usuarios de Linux utilizan para buscar cadenas de texto. Se puede usar para buscar en un fichero una cierta palabra o combinación de palabras o se puede canalizar la salida de otros comandos Linux a grep, de modo que grep pueda mostrarle sólo la salida que necesita ver.

Veamos algunos ejemplos realmente comunes. Digamos que necesitas comprobar el contenido de un directorio para ver si un cierto archivo existe allí. Eso es algo para lo que usarías el comando “ls”.

Pero, para hacer todo este proceso de chequeo de los contenidos del directorio aún más rápido, puedes canalizar la salida del comando ls al comando grep. Busquemos en nuestro directorio principal una carpeta llamada Documents.

ls sin grep

Y ahora intentemos comprobar el directorio de nuevo, pero esta vez usando grep para comprobar específicamente la carpeta Documents.

$ ls | grep Documents

ls grep

Como puede ver en la captura de pantalla anterior, el uso del comando grep nos ahorró tiempo al aislar rápidamente la palabra que buscábamos del resto de la salida innecesaria que producía el comando ls.

Si la carpeta Documents no existiera, grep no devolvería ninguna salida. Por lo tanto, si grep no devuelve nada, significa que no pudo encontrar la palabra que buscaba.

grep sin resultados

Buscar una cadena

Si necesita buscar una cadena de texto, en lugar de una sola palabra, tendrá que envolver la cadena entre comillas. Por ejemplo, ¿qué pasaría si tuviéramos que buscar el directorio “Mis Documentos” en lugar del directorio “Documentos” de una sola palabra?

$ ls | grep 'My Documents'

Buscar una cadena

Grep aceptará tanto comillas simples como dobles, así que envuelva su cadena de texto con cualquiera de las dos.

Aunque grep se utiliza a menudo para buscar la salida canalizada desde otras herramientas de línea de comandos, también puede utilizarlo para buscar documentos directamente. A continuación, se muestra un ejemplo en el que buscamos una cadena de texto en un documento de texto.

$ grep 'Class 1' Students.txt

grep para cadena en documento


Buscar varias cadenas

También puede usar grep para encontrar múltiples palabras o cadenas. Puede especificar múltiples patrones usando el interruptor -e. Intentemos buscar en un documento de texto dos cadenas diferentes:

$ grep -e 'Class 1' -e Todd Students.txt

grep cadenas múltiples

Note que sólo necesitábamos usar comillas alrededor de las cadenas que contenían espacios.

Diferencia entre grep egrep fgrep pgrep zgrep

Históricamente, varios interruptores grep se incluyeron en diferentes binarios. En los sistemas Linux modernos, encontrará estas opciones disponibles en el comando grep básico, pero es común ver que las distribuciones también soportan los otros comandos.

En la página principal de grep:

comandos grep

$ egrep is the equivalent of grep -E

Este interruptor interpretará un patrón como una expresión regular extendida. Hay un montón de cosas diferentes que puede hacer con esto, pero aquí tiene un ejemplo de cómo se ve el uso de una expresión regular con grep.

Busquemos en un documento de texto cadenas que contengan dos letras ‘p’ consecutivas:

$ egrep p\{2} fruits.txt

o

$ grep -E p\{2} fruits.txt

ejemplo de egrep

$ fgrep is the equivalent of grep -F

Este interruptor interpretará un patrón como una lista de cadenas fijas, e intentará hacer coincidir cualquiera de ellas. Es útil cuando necesita buscar caracteres de expresión regular. Esto significa que no tiene que escapar de los caracteres especiales como lo haría con el grep regular.

ejemplo de fgrep

pgrep es un comando para buscar el nombre de un proceso en ejecución en su sistema y devolver sus respectivos ID de proceso. Por ejemplo, puede usarlo para encontrar el ID del proceso del demonio SSH:

$ pgrep sshd

ejemplo de fgrep

Esto es similar en función a sólo canalizar la salida del comando ‘ps’ a grep..

prgrep vs ps

Podría usar esta información para cerrar un proceso en ejecución o para resolver problemas con los servicios que se ejecutan en su sistema.

zgrep se utiliza para buscar un patrón en los archivos comprimidos. Le permite buscar los archivos dentro de un archivo comprimido sin tener que descomprimirlo primero, lo que básicamente le ahorra uno o dos pasos extra.

$ zgrep apple fruits.txt.gz

ejemplo de zgrep

zgrep también funciona con ficheros tar, pero sólo parece llegar a decirle si ha podido encontrar una coincidencia o no.

archivo tar de zgrep

Mencionamos esto porque los ficheros comprimidos con gzip son muy comunes los archivos tar.


Diferencia entre find y grep

Para aquellos que recién comienzan en la línea de comandos de Linux, es importante recordar que find y grep son dos comandos con dos funciones muy diferentes, aunque ambos se usan para “encontrar” algo que el usuario especifica.

Es muy útil usar grep para encontrar un archivo cuando lo usas para buscar en la salida del comando ls, como mostramos en los primeros ejemplos del tutorial.

Sin embargo, si necesita buscar recursivamente el nombre de un archivo – o parte del nombre del archivo si usa un comodín (asterisco) – está muy adelantado para usar el comando ‘find’.

$ find /path/to/search -name name-of-file

comando find

La salida anterior muestra que el comando find fue capaz de localizar con éxito el archivo que buscamos.

Búsqueda recursiva

Puede usar la opción -r con grep para buscar recursivamente en todos los archivos de un directorio y sus subdirectorios un patrón especificado.

$ grep -r pattern /directory/to/search

Si no especifica un directorio, grep sólo buscará en su directorio de trabajo actual. En la siguiente captura de pantalla, grep encontró dos archivos que coinciden con nuestro patrón, y devuelve con sus nombres de archivo y el directorio en el que residen.

grep recursiva


Espacio de captura o tabulación

Como mencionamos anteriormente en nuestra explicación de cómo buscar una cadena, puede envolver el texto dentro de las comillas si contiene espacios. El mismo método funcionará para las pestañas, pero explicaremos cómo poner una pestaña en su comando grep en un momento.

Pon un espacio o varios espacios dentro de las comillas para que el grep busque ese carácter.

$ grep " " sample.txt

espacios grep

Hay varias maneras diferentes de buscar una pestaña con grep, pero la mayoría de los métodos son experimentales o pueden ser inconsistentes en las diferentes distribuciones.

La forma más fácil es simplemente buscar el carácter de tabulación en sí, que puedes producir pulsando ctrl+v en tu teclado, seguido de tabulación.

Normalmente, al pulsar tab en una ventana de terminal se le indica al terminal que desea autocompletar un comando, pero si se pulsa la combinación ctrl+v de antemano, el tabulador se escribirá como se espera normalmente en un editor de texto.

$ grep "    " sample.txt

pestañas grep

Conocer este pequeño truco es especialmente útil cuando se revisan los ficheros de configuración en Linux, ya que las pestañas se usan frecuentemente para separar los comandos de sus valores.

Using regular expressions

La funcionalidad de Grep se amplía aún más mediante el uso de expresiones regulares, lo que le permite una mayor flexibilidad en sus búsquedas. Existen varias, y repasaremos algunas de las más comunes en los ejemplos de abajo:

Los corchetes [] se utilizan para hacer coincidir cualquiera de un conjunto de caracteres.

$ grep "Class [123]" Students.txt

grep corchetes

Este comando devolverá cualquier línea que diga ‘Clase 1’, ‘Clase 2’ o ‘Clase 3’.

[-]Los corchetes con guion se pueden utilizar para especificar un rango de caracteres, ya sea numérico o alfabético.

$ grep "Class [1-3]" Students.txt

grep corchetes con guion

Obtenemos la misma salida que antes, pero el comando es mucho más fácil de escribir, especialmente si tenemos un rango mayor de números o letras.

^ capucha se utiliza para buscar un patrón que sólo se produce al principio de una línea.

$ grep "^Class" Students.txt

grep capucha

[^]Los corchetes con capucha se utilizan para excluir caracteres de un patrón de búsqueda.

$ grep "Class [^1-2]" Students.txt

grep corchetes con capucha

$ signo de dólar se utiliza para buscar un patrón que sólo ocurre al final de una línea.

$ grep "1$" Students.txt

grep signo de dólar

. punto se usa para coincidir con cualquier carácter, por lo que es un comodín, pero sólo para un único carácter.

$ grep "A….a" Students.txt

grep punto

Grep gz files sin descomprimir

Como hemos mostrado anteriormente, el comando zgrep puede utilizarse para buscar en los archivos comprimidos sin tener que descomprimirlos primero.

$ zgrep word-to-search /path/to/file.gz

También puede utilizar el comando zcat para mostrar el contenido de un archivo gz, y luego canalizar esa salida a grep para aislar las líneas que contienen la cadena de búsqueda.

$ zcat file.gz | grep word-to-search

zcat

Grep direcciones de correo electrónico desde un archivo zip

Podemos usar una expresión regular elegante para extraer todas las direcciones de correo electrónico de un archivo zip.

$ grep -o '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' emails.txt

El indicador -o sólo extraerá la dirección de correo electrónico, en lugar de mostrar la línea completa que contiene la dirección de correo electrónico. Esto da como resultado una salida más limpia.

correos electrónicos grep

Como con la mayoría de las cosas en Linux, hay más de una manera de hacer esto. También se puede usar egrep y un conjunto diferente de expresiones. Pero el ejemplo anterior funciona muy bien y es una forma bastante sencilla de extraer las direcciones de correo electrónico e ignorar todo lo demás.


Direcciones IP Grep

El greping de direcciones IP puede ser un poco complejo porque no podemos decirle a grep que busque 4 números separados por puntos – bueno, podríamos, pero ese comando también tiene el potencial de devolver direcciones IP inválidas.

El siguiente comando encontrará y aislará sólo las direcciones IPv4 válidas:

$ grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" /var/log/auth.log

Usamos esto en nuestro servidor Ubuntu sólo para ver desde dónde se han hecho los últimos intentos de SSH.

grep direcciones IP

Para evitar que se repita la información y que su pantalla se inunde, puede que quiera canalizar sus comandos grep a “uniq” y “more” como hicimos en la captura de pantalla anterior.

Grep o condición

Hay varias maneras diferentes de usar una condición con grep, pero le mostraremos la que requiere la menor cantidad de pulsaciones de teclas y es más fácil de recordar:

$ grep -E 'string1|string2' filename

o, técnicamente, usar egrep es aún menos teclas:

$ egrep 'string1|string2' filename

Grep o condición

Ignorar la sensibilidad a las mayúsculas y minúsculas

Por defecto, grep distingue entre mayúsculas y minúsculas, lo que significa que tiene que ser preciso en el uso de las mayúsculas en la cadena de búsqueda. Puede evitar esto diciéndole a grep que ignore las mayúsculas y minúsculas con el interruptor -i.

$ grep -i string filename

Ignorar la sensibilidad


Búsqueda con distinción de mayúsculas y minúsculas

¿Y si queremos buscar una cadena en la que la primera puede ser en mayúsculas o en minúsculas, pero el resto de la cadena debe ser en minúsculas? Ignorar las mayúsculas y minúsculas con el interruptor -i no funcionará en este caso, así que una forma sencilla de hacerlo sería con corchetes.

$ grep [Ss]tring filename

Este comando le dice a grep que sea sensible a las mayúsculas y minúsculas excepto en la primera letra.

grep sensible a mayúsculas y minúsculas

Coincidencia exacta de grep

En los ejemplos anteriores, siempre que buscamos en nuestro documento la cadena “apple”, grep también devuelve “pineapple” como parte de la salida. Para evitar esto, y buscar estrictamente “apple”, puede usar este comando:

$ grep "\<apple\>" fruits.txt

Coincidencia exacta de grep

También puede usar el interruptor -w, que le dirá a grep que la cadena debe coincidir con la línea entera. Obviamente, esto sólo funcionará en situaciones en las que no espere que el resto de la línea tenga ningún texto.

Patrón de exclusión

Para ver el contenido de un archivo, pero excluir patrones de la salida, puede utilizar el conmutador -v.

$ grep -v string-to-exclude filename

Patrón de exclusión

Como puede ver en la captura de pantalla, la cadena que excluimos ya no se muestra cuando ejecutamos el mismo comando con la opción -v.

Grep y reemplazar

Un comando grep pipeed to sed puede usarse para reemplazar todas las instancias de una cadena en un archivo. Este comando reemplazará “cadena1” con “cadena2” en todos los archivos relativos al directorio de trabajo actual:

$ grep -rl 'string1' ./ | xargs sed -i 's/string1/string2/g'

 

Grep con número de línea

Para mostrar el número de una línea en la que se encuentra la cadena de búsqueda, utilice el interruptor -n.

$ grep -n string filename

mostrar números de línea

Mostrar las líneas antes y después

Si necesita un poco más de contexto para la salida de la aplicación grep, puede mostrar una línea antes y después de la cadena de búsqueda especificada con el interruptor -c:

$ grep -c 1 string filename

Especifique el número de líneas que desea mostrar – en este ejemplo sólo hicimos una línea.

Mostrar las líneas antes y después

Ordenar el resultado

Convierte la salida de Pipe grep al comando sort para ordenar sus resultados en algún tipo de orden. El valor por defecto es alfabético.

$ grep string filename | sort

ordenar resultados grep

Espero que el tutorial le sea útil. Sigue volviendo.

Mokhtar Ebrahim
Estoy trabajando como administrador de sistemas Linux desde 2010. Soy responsable de mantener, proteger y solucionar problemas de servidores Linux para múltiples clientes de todo el mundo. Me encanta escribir guiones de shell y Python para automatizar mi trabajo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *