Pregunta 1¿Qué símbolo coincide con el inicio de una línea en una expresión regular?
Expresiones regulares básicas — patrones de grep
Practica las expresiones regulares básicas de grep — los 5 símbolos ^/$/./*/[], las expresiones extendidas con -E y -o para imprimir solo la coincidencia — extrayendo de archivos de texto.
Una herramienta para probar tu regex
También puedes probar los patrones de este artículo en el Probador de regex que funciona en el navegador. Te muestra dónde coincide tu patrón con tu texto de entrada, al instante.
Expresiones regulares básicas — ^ $ . * []
Una expresión regular es una forma de describir un patrón en el texto. grep interpreta la cadena que buscas como una expresión regular, así que puedes encontrar líneas por condiciones como 'empieza con este carácter' o 'aquí un carácter cualquiera', no solo por una cadena fija. Los 5 símbolos que hay que aprender para las expresiones regulares básicas son ^, $, ., * y [].
^ y $ son anclas para el inicio y el fin de una línea. . coincide con un carácter cualquiera y * significa cero o más repeticiones del carácter anterior. [abc] coincide con cualquiera de los caracteres entre corchetes y [a-z] coincide con un carácter en minúscula por rango. Combínalos para hacer búsquedas flexibles.
^ es el inicio de línea, $ el fin de línea y . un carácter cualquiera.| Símbolo | Significado | Ejemplo | Qué significa el ejemplo |
|---|---|---|---|
^ | Coincide con el inicio de una línea | grep '^c' f | Encuentra líneas que empiezan con c |
$ | Coincide con el fin de una línea | grep 't$' f | Encuentra líneas que terminan con t |
. | Coincide con un carácter cualquiera | grep 'c.t' f | Un carácter cualquiera entre c y t (cat/cot) |
* | Cero o más del carácter anterior | grep 'ab*c' f | Cualquier número de b entre a y c (ac/abc) |
[abc] | Coincide con cualquiera de los caracteres | grep '[cb]at' f | Encuentra cat o bat |
[a-z] | Cualquier carácter del rango | grep '[a-z]at' f | Un carácter en minúscula + at (cat/bat) |
\| | Coincide con uno u otro (o) | grep 'cat\|dog' f | Líneas que contienen cat o dog |
echo -e 'cat\ncot\ndog' > words.txt # crear material
grep '^c' words.txt # cat y cot, que empiezan con c
grep 't$' words.txt # cat y cot, que terminan con t
grep 'c.t' words.txt # cat y cot que coinciden con c?t
Repetición y clases de caracteres — * y []
* significa cero o más repeticiones del carácter anterior. ab*c coincide con líneas donde hay cero o más b, como ac, abc y abbc. [] coincide con cualquiera de los caracteres entre corchetes, así que [cb]at captura tanto cat como bat. Escribir un rango como [a-z] representa un carácter en minúscula.
echo -e 'ac\nabc\nabbc\naxc' > rep.txt # crear material
grep 'ab*c' rep.txt # ac abc abbc, con cero o más b
echo -e 'cat\nbat\nrat' > cls.txt # crear material
grep '[cb]at' cls.txt # las 2 líneas cat y bat
O — coincidir con uno u otro con \|
En las expresiones regulares básicas, | (o) se trata tal cual como un carácter ordinario.
Para expresar la alternancia, añade una barra invertida y escribe \|, así que grep 'cat\|dog' coincide con las líneas que contienen cat o dog.
Con grep -E, que aprenderás más adelante, puedes escribir | directamente en lugar de \|.
echo -e 'cat\ndog\nfox' > sel.txt # crear material
grep 'cat\|dog' sel.txt # las 2 líneas que contienen cat o dog
Regex extendidas e imprimir la coincidencia — grep -E / grep -o
En las expresiones regulares básicas, + | ( ) necesitan escaparse, como \+ \| \( \), pero con grep -E puedes escribirlos directamente. grep -E habilita las expresiones regulares extendidas (ERE). Ahora puedes escribir directamente + (uno o más), | (o) y () (grupo), que necesitaban escaparse en las regex básicas. grep -E 'cat|dog' coincide con las líneas que contienen cat o dog.
grep -o imprime solo la subcadena coincidente, no toda la línea coincidente. Si hay varias coincidencias en una línea, imprime cada una en una línea separada. Resulta útil cuando quieres extraer solo las coincidencias de un log y contarlas.
| Símbolo | Significado | Ejemplo | Qué significa el ejemplo |
|---|---|---|---|
+ | Uno o más del anterior | grep -E 'ab+c' f | Uno o más b entre a y c (abc/abbc) |
| | Coincide con uno u otro (o) | grep -E 'cat|dog' f | Líneas que contienen cat o dog |
() | Agrupación | grep -E '(ab)+' f | Una o más repeticiones de ab (ab/abab) |
-E habilita las regex extendidas y -o imprime solo la parte coincidente.| Cómo escribirlo | Significado | Ejemplo |
|---|---|---|
grep -E | Habilitar las regex extendidas (ERE) | grep -E 'cat|dog' f |
grep -o | Imprimir solo la parte coincidente | grep -o 'cat' f |
Regex más avanzadas
grep -P (regex compatible con Perl) es una extensión de GNU grep. En este curso aprendes las expresiones regulares básicas (^ $ . * []), grep -E para habilitar las regex extendidas y grep -o para imprimir solo la coincidencia. Funcionan igual en cualquier Linux.
echo -e 'cat\ndog\nfox' > animals.txt # crear material
grep -E 'cat|dog' animals.txt # las 2 líneas cat o dog
echo -e 'ac\nabc\nabbc' > plus.txt # crear material
grep -E 'ab+c' plus.txt # abc abbc, con uno o más b
echo -e 'cat cat dog' > line.txt # crear material
grep -o cat line.txt # imprime cada cat coincidente en su propia línea
Filtrar la salida de un comando — | grep
grep puede buscar no solo en un archivo pasado como argumento, sino también en la salida de otro comando pasada a través de un pipe |.
Canaliza el resultado de ls o cat a | grep para acotarlo solo a las líneas que necesitas.
ls cmds | grep '^c' muestra solo los nombres que empiezan con c del listado del directorio cmds, y cat archivo | grep palabra filtra el contenido de un archivo de la misma forma.
grep con | para acotarla solo a las líneas coincidentes. cmds es un pequeño directorio material que creas tú mismo.mkdir -p cmds # pequeño directorio material
touch cmds/cat cmds/cut cmds/sort # preparar 3 nombres
ls cmds | grep '^c' # cat y cut, que empiezan con c
echo -e 'apple\nbanana\ncherry' > fruit.txt # crear material
cat fruit.txt | grep an # solo banana, que contiene an
Verificación de conocimientos
Responde cada pregunta una a una.
Pregunta 2¿Qué representa el * en grep 'ab*c' f?
Pregunta 3¿Qué se imprime al ejecutar grep -o cat line.txt?