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:
- cp /usr/share/common-licenses/GPL-3 .
Si está en otro sistema, use el comando curl
para descargar una copia:
- 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:
- cp /usr/share/common-licenses/BSD .
Si está en otro sistema, cree el archivo con el siguiente comando:
- cat << 'EOF' > BSD
- Copyright (c) The Regents of the University of California.
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- 3. Neither the name of the University nor the names of its contributors
- 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
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
- 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
:
- 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:
- 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:
- grep -v "the" BSD
Recibirás este resultado:
OutputAll 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:
- grep -vn "the" BSD
Esto devolverá el siguiente texto:
Output2: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:
- grep "^GNU" GPL-3
Este comando devolverá las siguientes dos líneas:
OutputGNU 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
:
- grep "and$" GPL-3
Recibirás este resultado:
Outputthat 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:
- grep "..cept" GPL-3
Este comando devuelve el siguiente resultado:
Outputuse, 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 (
Por ejemplo, para encontrar las líneas que contienen too
o two
, especificaría esas variaciones de manera sucinta usando el siguiente patrón:
- grep "t[wo]o" GPL-3
El resultado muestra que ambas variaciones existen en el archivo:
Outputyour 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
:
- 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:
- grep "^[A-Z]" GPL-3
Aquí está el resultado que devuelve esta expresión:
OutputGNU 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 :
- 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:
- 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:
- grep "^[A-Z].*\.$" GPL-3
Esta es la salida que verá:
OutputSource.
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:
- grep "\(grouping\)" file.txt
- grep -E "(grouping)" file.txt
- 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:
- 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:
- 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:
- 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:
- grep -E "[AEIOUaeiou]{3}" GPL-3
Cada línea devuelta tiene una palabra con tres vocales:
Outputchanged, 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:
- 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.