En este artículo aprenderemos a usar el comando grep. No es una guía completa, pero veremos las opciones más utilizadas de la herramienta y ejemplos útiles.
- Introducción
- Sintaxis, opciones y expresiones regulares más utilizadas
- Ejemplos útiles
- Buscando en archivos
- Busqueda sin distinguir mayúsculas y minúsculas
- Buscar líneas que empiecen por un patrón
- Buscar líneas que empiecen por varios patrones
- Buscar lineas que contengas alguna de las palabras del patrón
- Buscar una palabra exacta
- Buscar palabras acentuadas y no acentuadas
- Utilizando el comodín punto (.)
- Contar las líneas en las que aparece el patrón
- Mostrar el número de la línea en la que aparece el patrón
- Buscar líneas que terminan con una palabra
- Buscar líneas que terminan con un punto
- Especificar que parte de la búsqueda es opcional
- Buscar una fecha
- Buscar una hora
- Buscando en directorios
- Utilizando tuberías
- Buscando en archivos
- Introducción (Volver al índice General)
El comando grep es una potente herramienta de búsqueda de texto, que se ejecuta desde la interfaz de línea de comandos (CLI). Se desarrolló para ser utilizado en sistemas UNIX, pero hoy día, es de uso casi obligatorio en sistemas GNU/Linux, sobre todo en equipos que carecen de interfaz gráfica, como suele ocurrir en equipos con el rol de servidor. Su desarrollo sigue la filosofía modular de UNIX, es decir, crear pequeños programas altamente especializados en una sola cosa, para luego utilizarlos combinados por medio de tuberías. Algunos de los programas utilizados en combinación con grep son cat, less, tail, ps, netstat, cut, etc, aunque es capaz de buscar en la salida de cualquier programa.grep busca patrones que definimos (utilizando expresiones regulares) en archivos de texto, directorios y subdirectorios o en la salida de otros comandos (entrada estándar, stdin) mediante tuberías, e imprime la línea o líneas que contenga dichos patrones.
- Sintaxis, opciones y expresiones regulares más utilizadas (Volver al índice General)
- Sintaxis (Volver al índice General)
La sintaxis de grep es la siguiente:$ grep [OPCIONES] PATRONES [ARCHIVO ...]
$ grep [OPCIONES] -e PATRONES ... [ARCHIVO ...]
$ grep [OPCIONES] -f ARCHIVO-DE-PATRONES ... [ARCHIVO ...]
Hay cuatro grandes variantes de grep, controladas por las siguientes opciones:
- -G, --basic-regexp : Interpreta el patrón como una expresión regular básica. Éste es el comportamiento predeterminado.
- -E, --extended-regexp : Interpreta el patrón como una expresión regular extendida.
- -F, --fixed-strings: Interpreta el patrón como una lista de cadenas de caracteres fijas, separadas por saltos de línea; se busca la concordancia de una cualquiera de ellas.
- -P, --perl-regexp: Interpreta el patrón como expresiones regulares compatibles con Perl.
Además, están disponibles tres programas variantes de grep que son:- egrep : Similar (pero no idéntico) a
grep −E
. - fgrep : Es lo mismo que
grep −F
. - rgrep : Es lo mismo que
grep −r
.
Estas variantes están obsoletas, pero se proporcionan por compatibilidad con versiones anteriores.
- Las opciones (Volver al índice General)
Las opciones más comunes son:- -e PATRONES, --regexp=PATRONES : Emplea PATRONES como el patrón de búsqueda. Si esta opción se usa múltiples veces o combinada con la opción
-f (--file)
, busca por todos los patrones dados. Útil para proteger patrones que comiencen con−
. - -f ARCHIVO-DE-PATRONES, --file=ARCHIVO-DE-PATRONES : Obtiene los patrones de ARCHIVO-DE-PATRONES. En ARCHIVO-DE-PATRONES se indicarán los patrones de búsqueda uno por línea. Si esta opción se usa múltiples veces o se combina con la opción
-e (--regexp)
, busca por todos los patrones dados. - -i, --ignore-case : La búsqueda no distinguirá entre mayúsculas y minúsculas.
- -v, --invert-match : Con esta opción, se nos muestran las líneas que no coinciden con el patrón que hemos buscado.
- -w, --word-regexp : Selecciona solamente aquellas líneas que contienen concordancias que forman palabras completas. La comprobación consiste en que la cadena de caracteres concordante debe estar al principio de la línea o precedida por un carácter que no forme parte de una palabra. De forma similar, debe estar o al final de la línea o ser seguida por un carácter no constituyente de palabra. Los caracteres que se consideran como parte de palabras son letras, dígitos y el subrayado.
- -x, --line-regexp : Seleccione solo aquellas coincidencias que coincidan exactamente con toda la línea. Para un patrón de expresión regular, esto es como poner entre paréntesis el patrón y luego rodearlo con
^
y$
. - -c, --count : Solo mostrará el número de líneas que coinciden con el patrón buscado.
- -n, --line-number : Prefija cada línea de salida con el número de línea de su fichero de entrada correspondiente.
- -d ACCIÓN, --directories=ACCIÓN : Si se pasa un directorio como argumento, usará ACTION para procesarlo. Por defecto, ACTION es
read
, es decir, lee directorios como si fueran archivos normales. Si ACCIÓN esskip
, salta los directorios silenciosamente. Si ACTION esrecurse
, lee todos los archivos en cada directorio de forma recursiva, siguiendo enlaces simbólicos solo si están en la línea de comando. Esto es equivalente a la opción-r
. - -r, --recursive : Lee todos los archivos de cada directorio de forma recursiva. Sigue enlaces simbólicos solo si están en la línea de comando. Si no se proporciona como parámetro ARCHIVO, grep buscará en el directorio de trabajo. Esto es equivalente a la opción
-d recurse
. - -R, --dereference-recursive : Lee todos los archivos de cada directorio, de forma recursiva. Sigue todos los enlaces simbólicos, a diferencia de la opción
-r
.
- -e PATRONES, --regexp=PATRONES : Emplea PATRONES como el patrón de búsqueda. Si esta opción se usa múltiples veces o combinada con la opción
- Expresiones regulares más utilizadas (Volver al índice General)
En este artículo trabajaremos con las siguientes expresiones regulares, pero hay muchas más:- El punto «.» : Se interpreta como cualquier carácter.
- El signo de interrogación «?» : El signo de interrogación tiene varias funciones dentro del lenguaje de las expresiones regulares. La primera de ellas es especificar que una parte de la búsqueda es opcional. Por ejemplo, la expresión regular «ob?scuridad» permite encontrar tanto «oscuridad» como «obscuridad».
- El acento circunflejo «^» : Representa el inicio de la cadena. Por ejemplo la expresión regular
^[0-9]
busca todos los párrafos que comiencen con un número. - El símbolo dólar «$» : Representa el final de la cadena de caracteres o el final de la línea. No representa un carácter en especial sino una posición.
- La barra inversa «\» : Se utiliza para escapar el siguiente carácter de la expresión de búsqueda de forma que este adquiera un significado especial o deje de tenerlo. Nunca se utiliza por si sola, siempre en combinación con otros caracteres.
- La barra «|» : Sirve para indicar una de varias opciones. Por ejemplo, la expresión regular
blanco|negro
encontrará dentro del texto las palabras «blanco» o «negro». - La función corchetes «[]» : Agrupa caracteres en grupos. Utiles para buscar uno de un grupo de caracteres. Por ejemplo,
[0123456789]
o[0-9]
bucaría en la cadena cualquier número entre el0
y el9
. Otro ejemplo,expresi[oó]n
nos permite buscar la palabra «expresión» o «expresión». Dentro de los corchetes todos los caracteres adquieren su valor literal, el punto es un punto y no un comodín. El único carácter que hay que anteceder con la barra inversa «\» es la propia barra inversa. - Las llaves «{}» : Comúnmente las llaves son caracteres literales cuando se utilizan por separado en una expresión regular. Para que adquieran su función de metacaracteres es necesario que encierren uno o varios números separados por coma y que estén colocados a la derecha de otra expresión regular, por ejemplo,
[0-9]{2}
esta expresión le dice al motor de búsqueda que encuentre dos dígitos contiguos.
- Sintaxis (Volver al índice General)
- Ejemplos útiles (Volver al índice General)
- Buscando en archivos (Volver al índice General)
En los siguientes ejemplos hemos utilizado un archivo de texto con el siguiente contenido:1. primera línea. Mortadelo 2. segunda línea Tercera línea. cuarta línea. 31/12/2021 12:00:00 7. séptima linea. mortadelo La casa La cosa La cisterna oscuridad obscuridad
A dicho archivo le hemos asignado el nombre de
prueba.txt
.- Busqueda sin distinguir mayúsculas y minúsculas (Volver al índice General)
En este ejemplo buscaremos un patrón utilizando la opción-i
para que la búsqueda no discrimine entre palabras en mayúsculas y minúsculas:$ grep -i mortadelo prueba.txt 1. primera línea. Mortadelo 7. séptima linea. mortadelo
Obtenemos las líneas que contienen la palabra
Mortadelo
ymortadelo
. Si no utilizamos la opción-i
, obtendríamos como salida la última línea en la que aparecemortadelo
en minúsculas. - Buscar líneas que empiecen por un patrón (Volver al índice General)
Para indicar a grep que ha de buscar líneas que comienzan por un patrón dado, deberemos emplear la expresión regular acento circunflejo «^». Además nos ayudaremos de la función corchetes «[]» para agrupar caracteres.Por ejemplo, busquemos líneas que comienzan con un número:
$ grep ^[0-9] prueba.txt 1. primera línea. Mortadelo 2. segunda línea 7. séptima linea. mortadelo
Busquemos ahora líneas que empiezan por una letra, ya sea mayúscula o minúscula:
$ grep ^[a-zA-Z] prueba.txt Tercera línea. cuarta línea. La casa La cosa La cisterna oscuridad obscuridad
- Buscar líneas que empiecen por varios patrones(Volver al índice General)
Busquemos las líneas que empiecen por la letrao
o la letraT
. En este ejemplo tendremos que activar la opción-E
para que interprete expresiones regulares extendidas ya que vamos a utilizar el símbolo barra «|»:$ grep -E ^o\|^T prueba.txt Tercera línea. oscuridad obscuridad
Hemos tenido que anteponer la barra inversa «\» para que el símbolo de la barra «|» adquiera su significado especial y deje de tener su significado literal.
- Buscar lineas que contengas alguna de las palabras del patrón (Volver al índice General)
En este ejemplo pediremos a grep que nos muestre aquellas líneas que contengan alguna de las tres palabras que forman el patrón:$ grep -E casa\|cosa\|cisterna prueba.txt La casa La cosa La cisterna
Seguimos utilizando la opción
-E
y anteponiendo la barra inversa «\» para que el símbolo de la barra «|» adquiera su significado especial y deje de tener su significado literal. - Buscar una palabra exacta (Volver al índice General)
Para buscar palabras exactas utilizaremos la opción-w
. En este ejemplo buscaremos la palabralínea
:$ grep -w línea prueba.txt 1. primera línea. Mortadelo 2. segunda línea Tercera línea. cuarta línea.
No olvidemos que
-w
selecciona solamente aquellas líneas que contienen concordancias que forman palabras completas. La comprobación consiste en que la cadena de caracteres concordante debe estar al principio de la línea o precedida por un carácter que no forme parte de una palabra. De forma similar, debe estar o al final de la línea o ser seguida por un carácter no constituyente de palabra. Los caracteres que se consideran como parte de palabras son letras, dígitos y el subrayado - Buscar palabras acentuadas y no acentuadas (Volver al índice General)
En el ejemplo anterior hemos buscado líneas que contienen la palabralínea
, pero en el archivoprueba.txt
hay varias erratas. Busquemos la misma palabra acentuada y no acentuada:$ grep l[ií]nea prueba.txt 1. primera línea. Mortadelo 2. segunda línea Tercera línea. cuarta línea. 7. séptima linea. mortadelo
- Utilizando el comodín punto (.) (Volver al índice General)
Recordemos que el símbolo punto «.» se interpreta como cualquier carácter. En este ejemplo buscaremos palabras que contengan la letrac
, seguida de cualquier carácter y a continuación, de la letras
:$ grep c.s prueba.txt La casa La cosa La cisterna
- Contar las líneas en las que aparece el patrón (Volver al índice General)
Utilizaremos el patrón del ejemplo anterior y añadiremos la opción-c
para pedirle a grep que cuente el número de líneas en el que aparece el patrón:$ grep -c c.s prueba.txt 3
La salida nos indica que en 3 líneas se encuentra el patrón indicado.
- Mostrar el número de la línea en la que aparece el patrón (Volver al índice General)
Volvemos a utilizar el patrón del ejemplo anterior pero utilizaremos la opción-n
que antepondrá a la línea el número de orden dentro del ficheroprueba.txt
:$ grep -n c.s prueba.txt 8:La casa 9:La cosa 10:La cisterna
- Buscar líneas que terminan con una palabra (Volver al índice General)
En este ejemplo buscaremos las líneas que terminan con la palabralínea
. Para hacerlo, utilizaremos la expresión regular símbolo dolar «$»:$ grep línea$ prueba.txt 2. segunda línea
- Buscar líneas que terminan con un punto (Volver al índice General)
Este ejemplo es interesante ya que el punto «.» forma parte de las expresiones regulares, es el comodín que se interpreta como cualquier carácter. Por lo tanto tendremos que utilizar en el patrón alguna expresión que indique el significado literal del punto «.» y no su significado especial:$ grep \\.$ prueba.txt Tercera línea. cuarta línea.
Hemos utilizado una barra invertida «\» para cambiar el valor literal por el valor especial de la siguiente barra inventida «\», la cual dotará de valor literál al punto «.».
- Especificar que parte de la búsqueda es opcional (Volver al índice General)
En estos ejemplos utilizaremos la expresión regular signo de interrogación «?», la cual nos permitirá especificar que parte de la búsqueda es opcional:$ grep ca\\?o\\?sa prueba.txt La casa La cosa
Veamos otro ejemplo:
$ grep ob\\?scuridad prueba.txt oscuridad obscuridad
El carácter delante de la expresión
\\?
es opcional. - Buscar una fecha (Volver al índice General)
Hay otras formas de hacerlo pero veremos la más fácil de entender. En este caso utilizaremos las expresiones regulares función corchetes «[]», que ya hemos visto en ejemplos anteriores y la función llaves «{}», que nos ayudará a indicar el número de caracteres contiguos:$ grep -E [0-9]{2}/[0-9]{2}/[0-9]{4} prueba.txt 31/12/2021
- Buscar una hora (Volver al índice General)
Muy parecido al anterior, solo cambiaremos algunos signos de puntuación:$ grep -E [0-9]{2}:[0-9]{2}:[0-9]{2} prueba.txt 12:00:00
- Busqueda sin distinguir mayúsculas y minúsculas (Volver al índice General)
- Buscando en directorios (Volver al índice General)
Con el comando grep podemos hacer búsquedas de patrones en todos los archivos ubicados en un directorio. Si en vez de pasar como parámetro un archivo, pasamos como parámetro la rutra de un directorio, grep buscará en todos los archivos de dicho directorio. Si no pasamos como parámetro archivo o directorio, grep buscará en todos los archivos del directorio de trabajo o actual. Además con las opciones-r
,--recursive
o-R
,--dereference-recursive
, grep leerá todos los archivos de cada directorio, de forma recursiva.Para los siguientes ejemplos, supongamos que en nuestro directorio personal (home) tenemos la siguiente estructura de directorios y archivos:
$ tree /home/miusuario/temporal/ /home/miusuario/temporal/ ├── prueba.txt └── temp2 └── prueba2.txt
- Buscar en un directorio (Volver al índice General)
Buscaremos en archivos de un directorio y no en los archivos de los subdirectorios si los hubiese. Por ejemplo, con la siguiente orden solo buscaría en los archivos del directorio/home/miusuario/temporal/
, no buscaría recursivamente:$ grep -i -d skip mortadelo /home/miusuario/temporal/* /home/miusuario/temporal/prueba.txt:1. primera línea. Mortadelo /home/miusuario/temporal/prueba.txt:7. séptima linea. mortadelo
- Buscar recursivamente en un directorio (Volver al índice General)
Buscaremos en archivos de un directorio y en los archivos de los subdirectorios si los hubiese. Por ejemplo, con la siguiente orden buscaría en los archivos del directorio/home/miusuario/temporal/
y en el subdirectoriotemp2
:$ grep -ir mortadelo /home/miusuario/temporal/ /home/miusuario/temporal/prueba.txt:1. primera línea. Mortadelo /home/miusuario/temporal/prueba.txt:7. séptima linea. mortadelo /home/miusuario/temporal/temp2/prueba2.txt:1. primera línea. Mortadelo /home/miusuario/temporal/temp2/prueba2.txt:7. séptima linea. mortadelo
La siguiente orden es igual a la anterior:
$ grep -id recurse mortadelo /home/karfer/temporal/ /home/karfer/temporal/prueba.txt:1. primera línea. Mortadelo /home/karfer/temporal/prueba.txt:7. séptima linea. mortadelo /home/karfer/temporal/temp2/prueba2.txt:1. primera línea. Mortadelo /home/karfer/temporal/temp2/prueba2.txt:7. séptima linea. mortadelo
En el modo recursivo, si omitimos el parámetro ARCHIVO indicado en su sintaxis, grep buscará recursivamente en el directorio de trabajo o actual:
$ pwd /home/miusuario/temporal
Si nos encontramos en el directorio
temporal
y ejecutamos la siguiente orden, obtendremos el mismo resultado de búsqueda que en el ejemplo anterior:$ grep -ir mortadelo prueba.txt:1. primera línea. Mortadelo prueba.txt:7. séptima linea. mortadelo temp2/prueba2.txt:1. primera línea. Mortadelo temp2/prueba2.txt:7. séptima linea. mortadelo
La única diferencia es que no especifica el directorio de trabajo o actual.
La siguiente orden es igual a la anterior:
$ grep -id recurse mortadelo prueba.txt:1. primera línea. Mortadelo prueba.txt:7. séptima linea. mortadelo temp2/prueba2.txt:1. primera línea. Mortadelo temp2/prueba2.txt:7. séptima linea. mortadelo
- Buscar en un directorio (Volver al índice General)
- Utilizando tuberías (Volver al índice General)
Como ya hemos dicho al principio del artículo, grep fue desarrollado siguiendo la filosofía modular de UNIX, es decir, crear pequeños programas altamente especializados en una sola cosa, para luego utilizarlos combinados por medio de tuberías. A continuación veremos un ejemplo simple de como filtrar la salida del cumando cut con grep.En el siguiente ejemplo, con el comando cut mostraremos los valores de los campos
1
y5
de cada una de las líneas del archivo/etc/passwd
y utilizando una tubería, buscaremos en la salida del comando cut aquellas líneas que empiezan por las letrasana
:$ cut -d ":" -f 1,5 /etc/passwd |grep ^ana anacleto:Agente Secreto,,,
- Buscando en archivos (Volver al índice General)
Espero que este artículo os haya sido de utilidad. Si pensáis que podéis colaborar para mejorar este artículo, que hay algo erróneo en él o simplemente deseáis comentarlo, por favor, dejad vuestra opinión más abajo.
Alonso Jenco Mendoza Soto
me sirvio mucho
J. Carlos
Hola Alonso,
Me alegro de que te sirviese.
Gracias por visitar </ZeppelinuX>