Búsqueda de sitios web

Cómo utilizar el comando grep de Linux


Aprenda los conceptos básicos sobre cómo buscar información en sus archivos y luego descargue nuestra hoja de referencia para obtener una guía de referencia rápida sobre grep y regex.

Uno de los comandos clásicos de Unix, desarrollado allá por 1974 por Ken Thompson, es el comando Global Regular Expression Print (grep). Es tan omnipresente en informática que se usa frecuentemente como verbo ("recorrer un archivo") y, dependiendo de qué tan geek sea su audiencia, también encaja muy bien en escenarios del mundo real. (Por ejemplo, "Tendré que buscar en mis bancos de memoria para recuperar esa información"). En resumen, grep es una forma de buscar en un archivo un patrón específico de caracteres. Si esto le suena a la función Buscar moderna disponible en cualquier procesador de textos o editor de textos, entonces ya ha experimentado los efectos de grep en la industria informática.

Lejos de ser simplemente un comando antiguo y pintoresco que ha sido reemplazado por la tecnología moderna, el verdadero poder de grep reside en dos aspectos:

  • Grep trabaja en la terminal y opera con flujos de datos, por lo que puede incorporarlos en procesos complejos. No sólo puedes encontrar una palabra en un archivo de texto; puedes extraer la palabra, enviarla a otro comando, etc.
  • Grep utiliza expresiones regulares para proporcionar una capacidad de búsqueda flexible.

Aprender el comando grep es fácil, aunque requiere algo de práctica. Este artículo le presenta algunas de sus funciones que considero más útiles.

[Descargue nuestra hoja de referencia grep gratuita]

Instalando grep

Si estás usando Linux, ya tienes grep instalado.

En macOS, tienes la versión BSD de grep. Esto difiere ligeramente de la versión GNU, por lo que si desea seguir exactamente este artículo, instale GNU grep desde un proyecto como Homebrew o MacPorts.

grep basico

La sintaxis básica de grep es siempre la misma. Usted proporciona al comando grep un patrón y un archivo en el que desea buscar. A cambio, imprime cada línea en su terminal con una coincidencia.

$ grep gnu gpl-3.0.txt
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

De forma predeterminada, el comando grep distingue entre mayúsculas y minúsculas, por lo que "gnu" es diferente de "GNU" o "Gnu". Puedes hacer que ignore las mayúsculas con la opción --ignore-case.

$ grep --ignore-case gnu gpl-3.0.txt
                    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
[...16 more results...]
<http://www.gnu.org/licenses/>.
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

También puedes hacer que el comando grep devuelva todas las líneas sin una coincidencia usando la opción --invert-match:

$ grep --invert-match \
--ignore-case gnu gpl-3.0.txt
                      Version 3, 29 June 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
[...648 lines...]
Public License instead of this License.  But first, please read

Tubería

Es útil poder encontrar texto en un archivo, pero el verdadero poder de POSIX es su capacidad de encadenar comandos a través de "canalizaciones". Creo que mi mejor uso de grep es cuando lo combino con otras herramientas, como cut, tr o curl.

Por ejemplo, supongamos que tengo un archivo que enumera algunos documentos técnicos que quiero descargar. Podría abrir el archivo y hacer clic manualmente en cada enlace, y luego hacer clic en las opciones de Firefox para guardar cada archivo en mi disco duro, pero eso requiere mucho tiempo y hacer clic. En su lugar, podría buscar los enlaces en el archivo, imprimiendo solo la cadena coincidente usando la opción --only-matching:

$ grep --only-matching http\:\/\/.*pdf example.html
http://example.com/linux_whitepaper.pdf
http://example.com/bsd_whitepaper.pdf
http://example.com/important_security_topic.pdf

El resultado es una lista de URL, cada una en una línea. Esto es una opción natural para cómo Bash procesa los datos, por lo que en lugar de imprimir las URL en mi terminal, puedo simplemente canalizarlas en curl:

$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name

Esto descarga cada archivo y lo guarda según su nombre de archivo remoto en mi disco duro.

Mi patrón de búsqueda en este ejemplo puede parecer críptico. Esto se debe a que utiliza expresiones regulares, una especie de lenguaje "comodín" que es particularmente útil cuando se realizan búsquedas amplias en una gran cantidad de texto.

Expresión regular

Nadie se hace la ilusión de que la expresión regular ("regex" para abreviar) sea fácil. Sin embargo, encuentro que a menudo tiene peor reputación de la que merece. Es cierto que existe la posibilidad de que las personas se vuelvan un poco demasiado inteligentes con las expresiones regulares hasta que sean tan ilegibles y tan amplias que se doblen sobre sí mismas, pero no es necesario exagerar con las expresiones regulares. Aquí hay una breve introducción a las expresiones regulares como yo las uso.

Primero, cree un archivo llamado example.txt e ingrese este texto en él:

Albania
Algeria
Canada
0
1
3
11

El elemento más básico de una expresión regular es el humilde carácter .. Representa un solo personaje.

$ grep Can.da example.txt
Canada

El patrón Can.da devolvió con éxito Canada porque el carácter . representaba un carácter cualquiera.

El comodín . se puede modificar para representar más de un carácter con estas notaciones:

  • ? coincide con el elemento anterior cero o una vez
  • * coincide con el elemento anterior cero o más veces
  • + coincide con el elemento anterior una o más veces
  • {4} coincide con el elemento anterior cuatro (o cualquier número que ingrese entre llaves) veces

Armado con este conocimiento, puedes practicar expresiones regulares en example.txt toda la tarde, viendo qué combinaciones interesantes se te ocurren. Algunos no funcionarán; otros lo harán. Lo importante es analizar los resultados, para entender por qué.

La expresión regular avanzada requiere la opción --extended-regexp o -E.

Por ejemplo, esto no devuelve ningún país:

$ grep -E A.a example.txt

Falla porque el carácter . solo puede coincidir con un único personaje a menos que lo subas de nivel. Usando el carácter *, puede decirle a grep que coincida con un solo carácter cero o tantas veces como sea necesario hasta que llegue al final de la palabra. Como conoce la lista con la que está tratando, sabe que cero veces es inútil en este caso. Definitivamente no hay nombres de países de tres letras en esta lista. Entonces, en su lugar, puedes usar + para hacer coincidir un solo carácter al menos una vez y luego tantas veces como sea necesario hasta el final de la palabra:

$ grep -E A.+a example.txt
Albania
Algeria

Puede utilizar corchetes para proporcionar una lista de letras:

$ grep -E [AC].+a example.txt
Albania
Algeria
Canada

Esto también funciona para los números. Los resultados pueden sorprenderle:

$ grep [1-9] example.txt
1
3
11

¿Le sorprende ver el 11 en una búsqueda de los dígitos del 1 al 9?

¿Qué pasa si agregas 13 a tu lista?

Estos números se devuelven porque incluyen 1, que se encuentra entre la lista de dígitos que deben coincidir.

Como puede ver, las expresiones regulares son una especie de rompecabezas, pero a través de la experimentación y la práctica, puede sentirse cómodo con ellas y usarlas para mejorar la forma en que analiza sus datos.

Descarga la hoja de trucos

El comando grep tiene muchas más opciones de las que demostré en este artículo. Hay opciones para formatear mejor los resultados, enumerar archivos y números de línea que contienen coincidencias, proporcionar contexto para los resultados imprimiendo las líneas que rodean una coincidencia y mucho más. Si estás aprendiendo grep, o simplemente lo utilizas con frecuencia y recurres a buscar en sus páginas info, te harás un favor descargando nuestra hoja de referencia. La hoja de trucos utiliza opciones cortas (-v en lugar de --invert-matching, por ejemplo) como una forma de familiarizarte con la taquigrafía común de grep. También contiene una sección de expresiones regulares para ayudarle a recordar los códigos de expresiones regulares más comunes. ¡Descarga la hoja de trucos de grep hoy! 

Artículos relacionados: