Búsqueda de sitios web

Uso de Grep y expresiones regulares para buscar patrones de texto en Linux


Introducción

El comando grep es uno de los comandos más útiles en un entorno de terminal Linux. El nombre grep significa \impresión de expresión regular global. Esto significa que puede usar grep para verificar si la entrada que recibe coincide con un patrón específico. Este programa aparentemente trivial es extremadamente poderoso; su capacidad para clasificar la entrada en función de reglas complejas lo convierte en un eslabón popular en muchas cadenas de comando.

En este tutorial, explorará las opciones del comando grep y luego se sumergirá en el uso de expresiones regulares para realizar búsquedas más avanzadas.

requisitos previos

Para seguir esta guía, necesitará acceso a una computadora que ejecute un sistema operativo basado en Linux. Puede ser un servidor privado virtual al que se haya conectado con SSH o su máquina local. Tenga en cuenta que este tutorial se validó con un servidor Linux que ejecuta Ubuntu 20.04, pero los ejemplos proporcionados deberían funcionar en una computadora que ejecuta cualquier versión de cualquier distribución de Linux.

Si planea usar un servidor remoto para seguir esta guía, le recomendamos que primero complete nuestra guía de configuración inicial del servidor. Al hacerlo, se configurará con un entorno de servidor seguro, que incluye un usuario no root con privilegios sudo y un firewall configurado con UFW, que puede usar para desarrollar sus habilidades de Linux.

Uso básico

En este tutorial, usará grep para buscar varias palabras y frases en la licencia pública general de GNU, versión 3.

Si está en un sistema Ubuntu, puede encontrar el archivo en la carpeta /usr/share/common-licenses. Cópielo en su directorio de inicio:

  1. cp /usr/share/common-licenses/GPL-3 .

Si está en otro sistema, use el comando curl para descargar una copia:

  1. curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt

También utilizará el archivo de licencia BSD en este tutorial. En Linux, puede copiar eso en su directorio de inicio con el siguiente comando:

  1. cp /usr/share/common-licenses/BSD .

Si está en otro sistema, cree el archivo con el siguiente comando:

  1. cat << 'EOF' > BSD
  2. Copyright (c) The Regents of the University of California.
  3. All rights reserved.
  4. Redistribution and use in source and binary forms, with or without
  5. modification, are permitted provided that the following conditions
  6. are met:
  7. 1. Redistributions of source code must retain the above copyright
  8. notice, this list of conditions and the following disclaimer.
  9. 2. Redistributions in binary form must reproduce the above copyright
  10. notice, this list of conditions and the following disclaimer in the
  11. documentation and/or other materials provided with the distribution.
  12. 3. Neither the name of the University nor the names of its contributors
  13. may be used to endorse or promote products derived from this software
  14. without specific prior written permission.
  15. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  16. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  17. IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  18. ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  19. FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  20. DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  21. OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  22. HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  23. LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  24. OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  25. SUCH DAMAGE.
  26. EOF

Ahora que tiene los archivos, puede comenzar a trabajar con grep.

En la forma más básica, usa grep para hacer coincidir patrones literales dentro de un archivo de texto. Esto significa que si le pasa a grep una palabra para buscar, imprimirá cada línea del archivo que contenga esa palabra.

Ejecute el siguiente comando para usar grep para buscar cada línea que contenga la palabra GNU:

  1. grep "GNU" GPL-3

El primer argumento, GNU, es el patrón que está buscando, mientras que el segundo argumento, GPL-3, es el archivo de entrada que desea buscar.

La salida resultante será cada línea que contenga el texto del patrón:

Output
GNU GENERAL PUBLIC LICENSE The GNU General Public License is a free, copyleft license for the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to Developers that use the GNU GPL protect your rights with two steps: "This License" refers to version 3 of the GNU General Public License. 13. Use with the GNU Affero General Public License. under version 3 of the GNU Affero General Public License into a single ... ...

En algunos sistemas, el patrón que buscó se resaltará en la salida.

Opciones comunes

De forma predeterminada, grep buscará el patrón exacto especificado dentro del archivo de entrada y devolverá las líneas que encuentre. Sin embargo, puede hacer que este comportamiento sea más útil agregando algunos indicadores opcionales a grep.

Si desea que grep ignore el \caso de su parámetro de búsqueda y busque variaciones tanto en mayúsculas como en minúsculas, puede especificar -i o --ignore-case opción.

Busque cada instancia de la palabra license (con mayúsculas, minúsculas o mixtas) en el mismo archivo que antes con el siguiente comando:

  1. grep -i "license" GPL-3

Los resultados contienen: LICENCIA, licencia y Licencia:

Output
GNU GENERAL PUBLIC LICENSE of this license document, but changing it is not allowed. The GNU General Public License is a free, copyleft license for The licenses for most software and other practical works are designed the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to price. Our General Public Licenses are designed to make sure that you (1) assert copyright on the software, and (2) offer you this License "This License" refers to version 3 of the GNU General Public License. "The Program" refers to any copyrightable work licensed under this ... ...

Si hubiera una instancia con LiCeNsE, también se habría devuelto.

Si desea encontrar todas las líneas que no contienen un patrón específico, puede usar la opción -v o --invert-match.

Busque cada línea que no contenga la palabra the en la licencia BSD con el siguiente comando:

  1. grep -v "the" BSD

Recibirás este resultado:

Output
All rights reserved. Redistribution and use in source and binary forms, with or without are met: may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ... ...

Como no especificó la opción \ignorar mayúsculas y minúsculas, los dos últimos elementos se devolvieron como si no tuvieran la palabra the.

A menudo es útil saber el número de línea en el que se producen las coincidencias. Puede hacerlo usando la opción -n o --line-number. Vuelva a ejecutar el ejemplo anterior con esta bandera agregada:

  1. grep -vn "the" BSD

Esto devolverá el siguiente texto:

Output
2:All rights reserved. 3: 4:Redistribution and use in source and binary forms, with or without 6:are met: 13: may be used to endorse or promote products derived from this software 14: without specific prior written permission. 15: 16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ... ...

Ahora puede hacer referencia al número de línea si desea realizar cambios en cada línea que no contiene the. Esto es especialmente útil cuando se trabaja con código fuente.

Expresiones regulares

En la introducción, aprendiste que grep significa \impresión de expresión regular global. Una \expresión regular es una cadena de texto que describe un patrón de búsqueda particular.

Diferentes aplicaciones y lenguajes de programación implementan expresiones regulares de forma ligeramente diferente. En este tutorial, solo explorará un pequeño subconjunto de la forma en que grep describe sus patrones.

Coincidencias literales

En los ejemplos anteriores de este tutorial, cuando buscó las palabras GNU y the, en realidad estaba buscando expresiones regulares básicas que coincidieran con la cadena exacta de caracteres GNU y el. Los patrones que especifican exactamente los caracteres que se van a emparejar se denominan \literales porque coinciden con el patrón literalmente, carácter por carácter.

Es útil pensar en estos como si coincidieran con una cadena de caracteres en lugar de con una palabra. Esto se convertirá en una distinción más importante a medida que aprenda patrones más complejos.

Todos los caracteres alfabéticos y numéricos (así como algunos otros caracteres) coinciden literalmente a menos que se modifiquen mediante otros mecanismos de expresión.

Coincidencias de anclaje

Los anclas son caracteres especiales que especifican en qué parte de la línea debe ocurrir una coincidencia para que sea válida.

Por ejemplo, al usar anclas, puede especificar que solo desea conocer las líneas que coinciden con GNU al principio de la línea. Para hacer esto, podría usar el ancla ^ antes de la cadena literal.

Ejecute el siguiente comando para buscar el archivo GPL-3 y encontrar líneas donde aparece GNU al principio de una línea:

  1. grep "^GNU" GPL-3

Este comando devolverá las siguientes dos líneas:

Output
GNU General Public License for most of our software; it applies also to GNU General Public License, you may choose any version ever published

De manera similar, usa el ancla $ al final de un patrón para indicar que la coincidencia solo será válida si ocurre al final de una línea.

Este comando coincidirá con cada línea que termine con la palabra and en el archivo GPL-3:

  1. grep "and$" GPL-3

Recibirás este resultado:

Output
that there is no warranty for this free software. For both users' and The precise terms and conditions for copying, distribution and License. Each licensee is addressed as "you". "Licensees" and receive it, in any medium, provided that you conspicuously and alternative is allowed only occasionally and noncommercially, and network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and provisionally, unless and until the copyright holder explicitly and receives a license from the original licensors, to run, modify and make, use, sell, offer for sale, import and otherwise run, modify and

Coincidencia de cualquier personaje

El carácter de punto (.) se usa en expresiones regulares para indicar que cualquier carácter individual puede existir en la ubicación especificada.

Por ejemplo, para hacer coincidir algo en el archivo GPL-3 que tenga dos caracteres y luego la cadena cept, usaría el siguiente patrón:

  1. grep "..cept" GPL-3

Este comando devuelve el siguiente resultado:

Output
use, which is precisely where it is most unacceptable. Therefore, we infringement under applicable copyright law, except executing it on a tells the user that there is no warranty for the work (except to the License by making exceptions from one or more of its conditions. form of a separately written license, or stated as exceptions; You may not propagate or modify a covered work except as expressly 9. Acceptance Not Required for Having Copies. ... ...

Esta salida tiene instancias de accept y except y variaciones de las dos palabras. El patrón también habría coincidido con z2cept si eso también se hubiera encontrado.

Expresiones de paréntesis

Al colocar un grupo de caracteres entre corchetes (\[ y \]), puede especificar que el carácter en esa posición puede ser cualquier carácter que se encuentre dentro del grupo de corchetes.

Por ejemplo, para encontrar las líneas que contienen too o two, especificaría esas variaciones de manera sucinta usando el siguiente patrón:

  1. grep "t[wo]o" GPL-3

El resultado muestra que ambas variaciones existen en el archivo:

Output
your programs, too. freedoms that you received. You must make sure that they, too, receive Developers that use the GNU GPL protect your rights with two steps: a computer network, with no transfer of a copy, is not conveying. System Libraries, or general-purpose tools or generally available free Corresponding Source from a network server at no charge. ... ...

La notación de corchetes le ofrece algunas opciones interesantes. Puede hacer que el patrón coincida con cualquier cosa excepto con los caracteres dentro de un corchete comenzando la lista de caracteres dentro de los corchetes con un carácter ^.

Este ejemplo es como el patrón .ode, pero no coincidirá con el patrón code:

  1. grep "[^c]ode" GPL-3

Este es el resultado que recibirá:

Output
1. Source Code. model, to give anyone who possesses the object code either (1) a the only significant mode of use of the product. notice like this when it starts in an interactive mode:

Observe que en la segunda línea devuelta, de hecho, está la palabra code. Esto no es una falla de la expresión regular o grep. Más bien, se devolvió esta línea porque anteriormente en la línea, se encontró el patrón mode, que se encuentra dentro de la palabra model. La línea se devolvió porque había una instancia que coincidía con el patrón.

Otra característica útil de los corchetes es que puede especificar un rango de caracteres en lugar de escribir individualmente cada carácter disponible.

Esto significa que si desea encontrar cada línea que comienza con una letra mayúscula, puede usar el siguiente patrón:

  1. grep "^[A-Z]" GPL-3

Aquí está el resultado que devuelve esta expresión:

Output
GNU General Public License for most of our software; it applies also to States should not allow patents to restrict development and use of License. Each licensee is addressed as "you". "Licensees" and Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an System Libraries, or general-purpose tools or generally available free Source. User Product is transferred to the recipient in perpetuity or for a ... ...

Debido a algunos problemas de clasificación heredados, a menudo es más preciso usar clases de caracteres POSIX en lugar de rangos de caracteres como acaba de usar.

Discutir cada clase de carácter POSIX estaría más allá del alcance de esta guía, pero un ejemplo que llevaría a cabo el mismo procedimiento que el ejemplo anterior usa la clase de carácter \[:upper:\] dentro de un selector de paréntesis :

  1. grep "^[[:upper:]]" GPL-3

La salida será la misma que antes.

Repita el patrón cero o más veces

Finalmente, uno de los metacaracteres más utilizados es el asterisco, o *, que significa \repetir el carácter o expresión anterior cero o más veces.

Para encontrar cada línea en el archivo GPL-3 que contiene un paréntesis de apertura y cierre, con solo letras y espacios simples en el medio, use la siguiente expresión:

  1. grep "([A-Za-z ]*)" GPL-3

Obtendrá el siguiente resultado:

Output
Copyright (C) 2007 Free Software Foundation, Inc. distribution (with or without modification), making available to the than the work as a whole, that (a) is included in the normal form of Component, and (b) serves only to enable use of the work with that (if any) on which the executable work runs, or a compiler used to (including a physical distribution medium), accompanied by the (including a physical distribution medium), accompanied by a place (gratis or for a charge), and offer equivalent access to the ... ...

Hasta ahora ha utilizado puntos, asteriscos y otros caracteres en sus expresiones, pero a veces necesita buscar esos caracteres específicamente.

Escape de meta-personajes

Hay momentos en los que necesitará buscar un período literal o un paréntesis de apertura literal, especialmente cuando se trabaja con código fuente o archivos de configuración. Debido a que estos caracteres tienen un significado especial en las expresiones regulares, necesita escape estos caracteres para decirle a grep que no desea usar su significado especial en este caso.

Puede escapar caracteres utilizando el carácter de barra invertida (\) delante del carácter que normalmente tendría un significado especial.

Por ejemplo, para encontrar cualquier línea que comience con una letra mayúscula y termine con un punto, use la siguiente expresión que escapa del punto final para que represente un punto literal en lugar del significado habitual de \cualquier carácter:

  1. grep "^[A-Z].*\.$" GPL-3

Esta es la salida que verá:

Output
Source. License by making exceptions from one or more of its conditions. License would be to refrain entirely from conveying the Program. ALL NECESSARY SERVICING, REPAIR OR CORRECTION. SUCH DAMAGES. Also add information on how to contact you by electronic and paper mail.

Ahora veamos otras opciones de expresiones regulares.

Expresiones regulares extendidas

El comando grep admite un lenguaje de expresiones regulares más amplio mediante el uso del indicador -E o llamando al comando egrep en lugar de grep.

Estas opciones abren las capacidades de \expresiones regulares extendidas. Las expresiones regulares extendidas incluyen todos los metacaracteres básicos, junto con metacaracteres adicionales para expresar coincidencias más complejas.

Agrupamiento

Una de las habilidades más útiles que abren las expresiones regulares extendidas es la capacidad de agrupar expresiones para manipularlas o referenciarlas como una unidad.

Para agrupar expresiones, enciérrelas entre paréntesis. Si desea usar paréntesis sin usar expresiones regulares extendidas, puede escaparlos con la barra invertida para habilitar esta funcionalidad. Esto significa que las siguientes tres expresiones son funcionalmente equivalentes:

  1. grep "\(grouping\)" file.txt
  2. grep -E "(grouping)" file.txt
  3. egrep "(grouping)" file.txt

Alternancia

De manera similar a cómo las expresiones de paréntesis pueden especificar diferentes opciones posibles para coincidencias de un solo carácter, la alternancia le permite especificar coincidencias alternativas para cadenas o conjuntos de expresiones.

Para indicar alternancia, use el carácter de barra vertical |. Estos se utilizan a menudo dentro de la agrupación entre paréntesis para especificar que una de dos o más posibilidades debe considerarse una coincidencia.

Lo siguiente encontrará GPL o General Public License en el texto:

  1. grep -E "(GPL|General Public License)" GPL-3

La salida se ve así:

Output
The GNU General Public License is a free, copyleft license for the GNU General Public License is intended to guarantee your freedom to GNU General Public License for most of our software; it applies also to price. Our General Public Licenses are designed to make sure that you Developers that use the GNU GPL protect your rights with two steps: For the developers' and authors' protection, the GPL clearly explains authors' sake, the GPL requires that modified versions be marked as have designed this version of the GPL to prohibit the practice for those ... ...

La alternancia puede seleccionar entre más de dos opciones agregando opciones adicionales dentro del grupo de selección separadas por caracteres de tubería adicionales (|).

cuantificadores

Al igual que el metacarácter * que coincidió con el carácter o conjunto de caracteres anterior cero o más veces, hay otros metacaracteres disponibles en expresiones regulares extendidas que especifican el número de ocurrencias.

Para hacer coincidir un carácter cero o una vez, puede usar el carácter ?. Esto hace que los caracteres o conjuntos de caracteres anteriores sean opcionales, en esencia.

Lo siguiente coincide con copyright y right colocando copy en un grupo opcional:

  1. grep -E "(copy)?right" GPL-3

Recibirás este resultado:

Output
Copyright (C) 2007 Free Software Foundation, Inc. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License "Copyright" also means copyright-like laws that apply to other kinds of ...

El carácter + coincide con una expresión una o más veces. Es casi como el metacarácter *, pero con el carácter +, la expresión debe coincidir al menos una vez.

La siguiente expresión coincide con la cadena free más uno o más caracteres que no son espacios en blanco:

  1. grep -E "free[^[:space:]]+" GPL-3

Verás este resultado:

Output
The GNU General Public License is a free, copyleft license for to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to When we speak of free software, we are referring to freedom, not have the freedom to distribute copies of free software (and charge for you modify it: responsibilities to respect the freedom of others. freedomss that you received. You must make sure that they, too, receive protecting users' freedom to change the software. The systematic of the GPL, as needed to protect the freedom of users. patents cannot be used to render the program non-free.

Especificación de repetición de coincidencia

Para especificar el número de veces que se repite una coincidencia, utilice los caracteres de llave ({ y }). Estos caracteres le permiten especificar un número exacto, un rango o un límite superior o inferior para la cantidad de veces que una expresión puede coincidir.

Utilice la siguiente expresión para encontrar todas las líneas en el archivo GPL-3 que contienen vocales triples:

  1. grep -E "[AEIOUaeiou]{3}" GPL-3

Cada línea devuelta tiene una palabra con tres vocales:

Output
changed, so that their problems will not be attributed erroneously to authors of previous versions. receive it, in any medium, provided that you conspicuously and give under the previous paragraph, plus a right to possession of the covered work so as to satisfy simultaneously your obligations under this

Para hacer coincidir cualquier palabra que tenga entre 16 y 20 caracteres, use la siguiente expresión:

  1. grep -E "[[:alpha:]]{16,20}" GPL-3

Aquí está la salida de este comando:

Output
certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. c) Prohibiting misrepresentation of the origin of that material, or

Solo se muestran las líneas que contienen palabras dentro de esa longitud.

Conclusión

grep es útil para encontrar patrones dentro de los archivos o dentro de la jerarquía del sistema de archivos, por lo que vale la pena dedicar tiempo a familiarizarse con sus opciones y sintaxis.

Las expresiones regulares son aún más versátiles y se pueden usar con muchos programas populares. Por ejemplo, muchos editores de texto implementan expresiones regulares para buscar y reemplazar texto.

Además, la mayoría de los lenguajes de programación modernos utilizan expresiones regulares para realizar procedimientos en datos específicos. Una vez que comprenda las expresiones regulares, podrá transferir ese conocimiento a muchas tareas comunes relacionadas con la computadora, desde realizar búsquedas avanzadas en su editor de texto hasta validar la entrada del usuario.