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 la informática que se usa con frecuencia como un verbo ("repasar un archivo") y, dependiendo de cuán geek sea su audiencia, también encaja muy bien en los escenarios del mundo real. (Por ejemplo, "Tendré que hacer grep 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 eso suena como la función de búsqueda moderna disponible en cualquier procesador de texto o editor de texto, entonces ya ha experimentado los efectos de grep en la industria informática.
Lejos de ser un comando antiguo y pintoresco que ha sido suplantado por la tecnología moderna, el verdadero poder de grep radica en dos aspectos:
- Grep funciona en la terminal y opera con flujos de datos, por lo que puede incorporarlos en procesos complejos. No solo puedes encontrar una palabra en un archivo de texto; puede extraer la palabra, enviarla a otro comando, etc.
- Grep usa expresiones regulares para proporcionar una capacidad de búsqueda flexible.
Aprendiendo el grep
El comando es fácil, aunque requiere algo de práctica. Este artículo le presenta algunas de sus características que encuentro más útiles.
[Descargue nuestra hoja de referencia gratuita de grep]
Instalando grep
Si está utilizando Linux, ya tiene instalado grep.
En macOS, tiene 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 básico
La sintaxis básica de grep es siempre la misma. Tú proporcionas el grep
ordene un patrón y un archivo que desee que busque. A cambio, imprime cada línea en tu 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>.
Por defecto, el grep
El comando distingue entre mayúsculas y minúsculas, por lo que "gnu" es diferente de "GNU" o "Gnu". Puede hacer que ignore las mayúsculas con --ignore-case
opción.
$ 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 el grep
comando devuelve todas las líneas sin una coincidencia usando --invert-match
opción:
$ 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ías
Es útil poder encontrar texto en un archivo, pero el verdadero poder de POSIX es su capacidad para encadenar comandos a través de "tuberías". Encuentro que mi mejor uso de grep es cuando se combina 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 es mucho tiempo y hacer clic. En cambio, podría buscar los enlaces en el archivo, imprimiendo solo la cadena coincidente usando --only-matching
opción:
$ 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. Este es un ajuste natural para la forma en que Bash procesa los datos, por lo que en lugar de tener las URL impresas en mi terminal, puedo canalizarlas a curl
:
$ grep --only-matching http\:\/\/.*pdf \
example.html | curl --remote-name
Más recursos de Linux
- Hoja de trucos de los comandos de Linux
- Hoja de trucos de comandos avanzados de Linux
- Curso en línea gratuito:Descripción general técnica de RHEL
- Hoja de trucos de red de Linux
- Hoja de trucos de SELinux
- Hoja de trucos de los comandos comunes de Linux
- ¿Qué son los contenedores de Linux?
- Nuestros últimos artículos sobre Linux
Esto descarga cada archivo y lo guarda de acuerdo con 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 usa expresiones regulares, una especie de lenguaje "comodín" que es particularmente útil cuando se busca de forma amplia en mucho texto.
Expresión regular
Nadie se hace la ilusión de que la expresión regular ("regex" para abreviar) es fácil. Sin embargo, encuentro que a menudo tiene una reputación peor de la que merece. Es cierto que existe la posibilidad de que las personas se vuelvan un poco demasiado inteligentes con expresiones regulares hasta que sea tan ilegible y tan amplio que se pliegue sobre sí mismo, pero no es necesario que exagere sus expresiones regulares. Aquí hay una breve introducción a las expresiones regulares de la forma en que las uso.
Primero, crea 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 expresiones regulares es el humilde .
personaje. Representa un solo carácter.
$ grep Can.da example.txt
Canada
El patrón Can.da
devuelto con éxito Canada
porque el .
personaje representado cualquiera uno personaje.
El .
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, puede 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 que entiendas por qué.
La expresión regular avanzada requiere --extended-regexp o -E opción.
Por ejemplo, esto no devuelve ningún país:
$ grep -E A.a example.txt
Falla porque el .
El personaje solo puede coincidir con un solo personaje a menos que lo subas de nivel. Usando el *
carácter, puedes decirle a grep
para hacer coincidir un solo carácter cero o tantas veces como sea necesario hasta llegar 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, puede 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 usar 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 sorprenderte:
$ grep [1-9] example.txt
1
3
11
¿Te 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 para hacer coincidir.
Como puede ver, regex es una especie de rompecabezas, pero a través de la experimentación y la práctica, puede sentirse cómodo con él y usarlo para mejorar la forma en que analiza sus datos.
Descargar la hoja de trucos
El grep
El comando tiene muchas más opciones de las que demostré en este artículo. Hay opciones para mejorar el formato de los resultados, listar archivos y números de línea que contienen coincidencias, proporcionar contexto para los resultados al imprimir las líneas que rodean una coincidencia y mucho más. Si está aprendiendo grep, o simplemente lo usa con frecuencia y recurre a buscar a través de su info
páginas, te harás un favor descargando nuestra hoja de trucos para ello. La hoja de trucos usa opciones cortas (-v
en lugar de --invert-matching
, por ejemplo) como una forma de familiarizarse con la taquigrafía común de grep. También contiene una sección de expresiones regulares para ayudarlo a recordar los códigos de expresiones regulares más comunes. ¡Descargue la hoja de trucos de grep hoy!