Búsqueda de sitios web

Explicado: ¿Qué es el comando Grep en Linux?


Grep es quizás uno de los comandos más utilizados en Linux. Descubra por qué se creó y cómo se utiliza en este artículo explicativo.

Si usa Linux para el trabajo habitual o para desarrollar e implementar software, debe haber encontrado el comando grep.

En este artículo explicativo, te diré qué es el comando grep y cómo funciona.

¿Qué es grep?

Grep es una utilidad de línea de comandos en sistemas Unix y Linux. Se utiliza para encontrar patrones de búsqueda en el contenido de un archivo determinado.

Con su nombre inusual, habrás adivinado que grep es un acrónimo. Esto es al menos parcialmente cierto, pero depende de a quién le preguntes.

Según fuentes acreditadas, el nombre en realidad deriva de un comando en un editor de texto UNIX llamado ed. En el cual, la entrada g/re/p realizó una búsqueda global (g) de una expresión regular (re) y posteriormente imprimió (p) cualquier línea coincidente.

El comando grep hace lo que hicieron los comandos g/re/p en el editor. Realiza una búsqueda global de una expresión regular y la imprime. Es mucho más rápido buscando archivos grandes.

Esta es la narrativa oficial, pero es posible que también la veas descrita como expresión Gglobal Rregular (P rocessor | Parser | Impresora). La verdad es que hace todo eso.

La interesante historia detrás de la creación de grep.

Ken Thompson ha hecho contribuciones increíbles a la informática. Ayudó a crear Unix, popularizó su enfoque modular y escribió muchos de sus programas, incluido grep.

Thompson creó grep para ayudar a uno de sus colegas en Bell Labs. El objetivo de este científico era examinar patrones lingüísticos para identificar a los autores (incluido Alexander Hamilton) de los Federalist Papers. Este extenso cuerpo de trabajo fue una colección de 85 artículos y ensayos anónimos redactados en defensa de la Constitución de los Estados Unidos. Pero como estos artículos eran anónimos, el científico intentaba identificar a los autores basándose en un patrón lingüístico.

El editor de texto original de Unix, ed, (también creado por Thompson) no era capaz de buscar un cuerpo de texto tan grande dadas las limitaciones del hardware de la época. Entonces, Thompson transformó la función de búsqueda en una utilidad independiente del editor de redacción.

Si lo piensas bien, eso significa que Alexander Hamilton técnicamente ayudó a crear grep. No dudes en compartir este dato curioso con tus amigos en tu fiesta de relojes Hamilton. 🤓

¿Qué es una expresión regular, nuevamente?

Una expresión regular (o expresión regular) puede considerarse como una consulta de búsqueda. Las expresiones regulares se utilizan para identificar, unir o gestionar texto de otro modo.

Sin embargo, Regex es capaz de hacer mucho más que búsquedas de palabras clave. Se puede utilizar para encontrar cualquier tipo de patrón imaginable. Los patrones se pueden encontrar más fácilmente utilizando metacaracteres. Estos caracteres especiales que hacen que esta herramienta de búsqueda sea mucho más poderosa.

Cabe señalar que grep es sólo una herramienta que utiliza expresiones regulares. Existen capacidades similares en toda la gama de herramientas, pero los metacaracteres y la sintaxis pueden variar. Esto significa que es importante conocer las reglas de su procesador de expresiones regulares en particular.

Un ejemplo práctico de grep: hacer coincidir números de teléfono

Esta herramienta puede resultar intimidante tanto para los principiantes como para los usuarios experimentados de Linux. Desafortunadamente, incluso un patrón relativamente simple como un número de teléfono puede resultar en una cadena de expresiones regulares de apariencia "aterradora".

Quiero asegurarte que no debes entrar en pánico cuando veas expresiones como esta. Una vez que se familiarice con los conceptos básicos de las expresiones regulares, puede abrir un nuevo mundo de posibilidades para su informática.

Nota cultural: este ejemplo utiliza convenciones de EE. UU. (NANP) para números de teléfono. Se trata de identificaciones de 10 dígitos que se dividen en un código de área (3 dígitos) y una combinación única de 7 dígitos donde los primeros 3 dígitos corresponden a una oficina central de telecomunicaciones (conocida como prefijo) y los últimos 4 se denominan línea. número. Entonces el patrón es AAA-PPP-LLLL.

Creé un archivo llamado phone.txt y escribí 4 variaciones comunes del mismo número de teléfono. Voy a usar grep para reconocer el patrón numérico independientemente del formato.

También agregué una línea que no se ajustará a la expresión para usar como control. La línea final 555!123!1234 no es un patrón de número de teléfono estándar y no será devuelta por la expresión grep.

El contenido de los archivos phone.txt es:

christopher@linux-handbook:~$ cat phone.txt 
5551231234
555 123 1234
555-123-1234
(555)-123-1234
555!123!1234

Para "recopilar" los números de teléfono, escribiré mi expresión regular usando metacaracteres para aislar los datos relevantes e ignorar lo que no necesito.

El comando completo se verá así:

christopher@linux-handbook:~$ grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' phone.txt

Parece un poco intenso, ¿verdad? Dividámoslo en partes para tener una mejor idea de lo que está sucediendo.

Comprender las expresiones regulares, un segmento a la vez

Primero, separemos la sección de RegEx que busca el "código de área" en el número de teléfono.

Se repite parcialmente un patrón similar para obtener también el resto de los dígitos. Es importante tener en cuenta que el código de área a veces se encapsula entre paréntesis, por lo que debe tenerlo en cuenta con la expresión aquí.

La lógica de toda la sección del código de área está encapsulada en un conjunto de llaves con escape. Puedes ver que mi código comienza con \( y termina con \).

Cuando usas los corchetes [0-9], le estás haciendo saber a grep que estás buscando un número entre 0 y 9. De manera similar, puedes usar [a-z] para unir letras del alfabeto.

El número entre llaves {3\} significa que el elemento entre llaves coincide exactamente tres veces.

¿Sigo confundido? No te estreses. Vas a ver este ejemplo de varias maneras para que te sientas seguro de seguir adelante.

Intentemos observar la lógica de la sección del código de área en pseudocódigo. He aislado cada segmento de la expresión.

Pseudocódigo del código de área RegEx

  • \(

  • (Número de 3 dígitos)

  • |

  • Número de 3 dígitos

  • \)

Con suerte, verlo así hace que la expresión regular sea más sencilla. En lenguaje sencillo, busca números de 3 dígitos. Cada dígito puede ser del 0 al 9 y es posible que o no haya paréntesis alrededor del código de área.

Luego, hay una parte extraña al final de nuestra primera sección.

  • [-]\?

¿Qué significa? El símbolo \? significa "coincide con cero o uno del carácter anterior". Aquí, eso se refiere a lo que está entre corchetes [ -].

En otras palabras, puede haber o no un guión después de los dígitos.

Codigo de AREA

Ahora, reconstruyamos el mismo bloque con el código real. Luego agregaré las otras partes de la expresión.

  • \(

  • ([0-9]\{3\})

  • |

  • [0-9]\{3\}

  • \)

  • [-]\?

Prefijo

Para completar el patrón del número de teléfono, simplemente puede reutilizar parte de su código existente.

[0-9]\{3\}[ -]\?

No tiene que preocuparse por el paréntesis que rodea al prefijo, pero aún así puede tener o no un - entre el prefijo y los dígitos de línea del número de teléfono.

Línea de números

La última sección del número de teléfono no requiere que busquemos ningún otro carácter, pero es necesario actualizar la expresión para reflejar el dígito adicional.

[0-9]\{4\}

Eso es todo. Ahora asegurémonos de que la expresión esté entre comillas para minimizar comportamientos inesperados.

Aquí está la expresión completa de nuevo.

christopher@linux-handbook:~$ grep '\(([0-9]\{3\})\|[0-9]\{3\}\)[ -]\?[0-9]\{3\}[ -]\?[0-9]\{4\}' phone.txt

Puedes ver que los resultados están resaltados en color. Es posible que este no sea el comportamiento predeterminado en su distribución de Linux.

Consejo adicional

Si desea que sus resultados se resalten, puede agregar --color=auto a su comando. También puede agregar esto a su perfil de shell como un alias para que cada vez que escriba grep se ejecute como grep --color=auto.

Espero que ahora comprenda mejor el comando grep. Mostré solo un ejemplo para explicar las cosas. Si está interesado, puede consultar este artículo para obtener más ejemplos prácticos del comando grep.

Proporcione su sugerencia sobre el artículo dejando un comentario.