arrow_back Volver
Inicio keyboard_arrow_right Artículos keyboard_arrow_right Artículo

Cómo utilizar el comando GREP

Eduardo Ismael Garcia

Full Stack Developer at Código Facilito.

av_timer 5 Min. de lectura

remove_red_eye 7080 visitas

calendar_today 27 Julio 2021

El comando grep, por sus siglas al ingles Global Regular Expression Print, es sin duda uno de los comandos que todo(a) administradora(a) de servidores debe conocer y dominar. Y no exagero, puedo asegurarte que, tarde o temprano, este comando salvara tu vida en una bella noche de mantenimiento. 💻

Si nunca habías escuchado acerca de él, aquí te lo explico. Verás, el comando grep nos permite realizar búsqueda de patrones sobre los diferentes archivos de nuestro sistema. Ideal cuando nos encontramos administrando servidores remotos. 🔍

Si bien esto en primera instancia puede sonar algo trivial, déjame decirte que no lo es; ya que si recordamos, la gran mayoría de sistemas operativos utilizados en servidores no cuentan con interfaz grafica, lo cual sin duda dificulta la búsqueda de texto para los archivos que debemos administrar (Archivos de configuración, logs, temporales etc ....)

Es por ello que, para esta nueva entrega, me gustaría compartir con todos ustedes un pequeño tutorial sobre cómo podemos utilizar y sacarle el máximo provecho al comando grep.

Para este tutorial estaré trabajando con el siguiente archivo: frankenstein.txt

Usaré los primeros 6 párrafos de la obra. Tú por supuesto puedes utilizar el archivo que desees. Te recomiendo sea una archivo en texto plano, un archivo .txt serviría bastante bien. 😋

Bien, una vez dicho todo esto, pongamos manos a la obra. 🥳

Grep 📜🔍

Lo primero que debemos conocer sobre el comando grep es la estructura a utilizar.

grep [opciones] patrón a buscar [ARCHIVO]

Las opciones son, como su nombre nos dicen, opcionales, y para conocer a todas ellas ejecutaremos el siguiente comando.

grep --help

Podemos observar una gran cantidad de opciones, sin embargo las más utilizadas, desde mi experiencia, son las siguientes:

  • i: La búsqueda no distinguirá entre mayúsculas y minúsculas.
  • c: Se muestra en pantalla el número de líneas que coinciden con el patrón.
  • r: Búsqueda recursiva para el directorio.
  • v: Se muestra todas las líneas que no coinciden con el patrón .
  • w: Realiza la búsqueda únicamente por palabras.
  • n: Se muestra en pantalla la línea donde se coincide con el patrón.
  • m: Cantidad máxima de líneas a mostrar.

Bien, una vez con la estructura base y algunas opciones, comencemos con algo sencillo, por ejemplo, mostremos en pantalla todas las líneas donde se encuentra la palabra sea.

Para ello el comando pudierá quedar de la siguiente manera. No tomemos en cuenta mayúsculas y minúsculas.

$ grep -i sea frankenstein.txt

En mi caso obtengo la siguiente salida.

and vivid.  I try in vain to be persuaded that the pole is the seat of
and, sailing over a calm sea, we may be wafted to a land surpassing in
through the seas which surround the pole.  You may remember that a
had forbidden my uncle to allow me to embark in a seafaring life.
accompanied the whale-fishers on several expeditions to the North Sea;
deck and remaining seated motionless for hours, when no exercise

En cada una de estas líneas encontramos sea, ya sea como una palabra o dentro de una. Por ejemplo seat.

Para limitar la cantidad de líneas a mostrar, usaremos la opción m, pasando como argumento el número de líneas máximas. Por ejemplo, limitemos a un máximo de 2.

grep -im 2 sea frankenstein.txt
and vivid.  I try in vain to be persuaded that the pole is the seat of
and, sailing over a calm sea, we may be wafted to a land surpassing in

Si en el patrón queremos buscar una palabra como tal, y no los caracteres, haremos uso de la opción w.

$ grep -wi sea frankenstein.txt

Mi salida es mucho más reducida.

and, sailing over a calm sea, we may be wafted to a land surpassing in
accompanied the whale-fishers on several expeditions to the North Sea;

Ahora solo visualizamos las líneas que posean sea. Mucho mejor 🤓

Por su parte, si queremos contar la cantidad de líneas donde se encuentra nuestro patrón (En este caso la palabra sea), podemos añadir la opción c.

$ grep -cwi sea frankenstein.txt
2

Las opciones, como podemos observar, pueden no llevar un ordenen en concreto. 🥳

Si queremos conocer el contexto sobre donde se esta utilizando el patrón, usaremos algunas de la siguientes opciones:

  • A: Muestra el número de línea después del match.
  • B :Muestra el número de línea antes del match.
  • C: Muestra el número de línea antes después del match.

Ejemplos.

$ grep -wiA 1 sea frankenstein.txt
and, sailing over a calm sea, we may be wafted to a land surpassing in
wonders and in beauty every region hitherto discovered on the habitable
--
accompanied the whale-fishers on several expeditions to the North Sea;
I voluntarily endured cold, famine, thirst, and want of sleep; I often

Visualizamos una línea después de la línea match.

$ grep -wiB 2 sea frankenstein.txt
perpetual splendour.  There--for with your leave, my sister, I will put
some trust in preceding navigators--there snow and frost are banished;
and, sailing over a calm sea, we may be wafted to a land surpassing in
--
can, even now, remember the hour from which I dedicated myself to this
great enterprise.  I commenced by inuring my body to hardship.  I
accompanied the whale-fishers on several expeditions to the North Sea;

Visualizamos 2 líneas antes de la línea match.

Si queremos conocer exactamente en que línea se hizo el match, nos apoyamos de la opción n.

$ grep -win sea frankenstein.txt
19:and, sailing over a calm sea, we may be wafted to a land surpassing in
67:accompanied the whale-fishers on several expeditions to the North Sea;

En mi caso en la línea 19 y 69 podré encontrar la palabra sea ya sea en mayúsculas o minúsculas. 👀

Antes de continuar me gustaría mencionar que, si lo que deseamos es buscar una oración y no una sola palabra, haremos uso de comillas dobles o simples .

Ejemplo.

$ grep "north of London" frankenstein.txt
I am already far north of London, and as I walk in the streets of

Ideal para cuando queremos realizar una búsqueda de un posible error sobre archivos logs. 🤯

$ grep "404 Bad Request" logs

Búsqueda de múltiples patrones.

Si queremos buscas sobre un mismo archivo diferentes patrones, usaremos la opción e. Una vez por cada nuevo patrón.

grep -wie sea -wie passage frankenstein.txt

Para este ejemplo buscamos tanto la plabra sea_como _pessage.

Búsqueda en directorios.

Compliquemos un poco más las cosas, por ejempló, busquemos la palabra celestial en todos los archivos de nuestro directorio.

En este caso buscamos sobre todos los archivos sin importar la extensión.

grep celestial *
./frankenstein.txt:regulate a thousand celestial observations that require only this

Si queremos conocer que archivos poseen dicho patrón, hacemos uso de la opción l.

grep -l celestial ./*
./frankenstein.txt

Por supuesto, en la búsqueda por archivos también podemos utilizar los comandos previamente mencionados.

$  grep -iwc celestial ./*
./dump.sql:0
./example.txt:0
./frankenstein.txt:1

En este caso contamos la cantidad de coincidencias sobre cada uno de los archivos.

Pipes

Algo super común de grep es utilizarlo en conjunto con otros comandos, para ello haremos uso de los pipes.

Si no conoce que son los pipes te comparto un post en CodigoFacilito donde te lo explicamos más en detalle. 🐊

Por ejemplo, de las últimas 20 líneas del archivo, busquemos en que líneas aparece el nombre Margaret. Para ello primero utilizamos el comando tail y posteriormente grep.

$ tail -n 20 frankenstein.txt | grep -in Margaret 
18:Farewell, my dear, excellent Margaret. Heaven shower down blessings on
Conclusión

En conclusión, como pudimos observar, la gran cantidad de opciones que grap nos ofrece nos permite hacer frente a los escenarios más comunes en cuanto a búsqueda de patrones se refiere. Pudiendo buscar, excluir, contar, limitar, etc...

Para este post trabajé con un fragmento de la novela Frankenstein, aun que, desde mi experiencia, sin duda alguna usaras grep sobre archivos de código, configuracion o, en la gran mayoría de los casos, logs. 🍻