-
Notifications
You must be signed in to change notification settings - Fork 0
03 El Comando grep
Grep significa globally search a regular expression and print.
El comando grep busca el PATRÓN en cada ARCHIVO. Si la opción -e o -f no son utilizadas, entonces el primer operando PATRONES es uno o más patrones separados por saltos de línea, y se imprimirá cada línea que coincida con alguno de ellos.
Tip
Se recomienda entrecomillar con comillas simples ' el PATRÓN para evitar el
globbing (expansión de pathnames).
Para más información acerca del globbing véase
Wildcards (Globbing Patterns) o ejecuta man 7 glob.
Tip
Para más información acerca de las expresiones regulares (RegEx) véase
Expresiones Regulares (RegEx) o ejecuta man 7 regex y para más
información acerca del comando grep ejecuta grep --help, man 1 grep o
info grep.
grep [OPCIONES]... PATRONES [ARCHIVO]...
grep [OPCIONES]... -e PATRONES ... [ARCHIVO]...
grep [OPCIONES]... -f PATTERN_FILE ... [ARCHIVO]...
| Opción Corta | Opción Larga | Descripción | Ejemplo |
|---|---|---|---|
| -G | --basic-regexp | Interpreta los PATRONES como Basic Regular Expressions (BRE). Opción predeterminada |
grep '^[0-9]\+.' README.mdgrep -G '^[[:digit:]]\+.' README.md
|
| -E | --extended-regexp | Interpreta los PATRONES como Extended Regular Expressions (ERE) |
grep -E '^[0-9]+.' README.mdgrep -E '^[[:digit:]]+.' README.md
|
| -P | --perl-regexp | Interpreta los PATRONES como Perl-Compatible Regular Expressions (PCRE) |
grep -P '^[0-9]+.' README.mdgrep -P '^\d+.' README.md
|
| -F | --fixed-strings | Interpreta los PATRONES como strings literales, es decir, sin interpretarlos como RegEx |
grep -F '^[0-9]\+.' README.mdgrep -F '^[[:digit:]]\+.' README.md
|
| -e | --regexp=PATRÓN | Especifica explícitamente un PATRÓN; permite múltiples patrones en un mismo comando | grep -e 'error' -e 'warning' syslog |
| -f | --file=ARCHIVO | Lee los patrones desde ARCHIVO, uno por línea; si ARCHIVO es -, lee desde stdin
|
grep -f patrones.txt syslog |
| Opción Corta | Opción Larga | Descripción | Ejemplo |
|---|---|---|---|
| -i | --ignore-case | Aplica grep en modo case insensitive (sin distinguir mayúsculas de minúsculas) | grep -i 'recordatorio' *.txt |
| -v | --invert-match | Aplica grep en modo invertido, imprimiendo todas aquellas líneas que NO coincidan con el PATRÓN | grep -v 'secreto' *.txt |
| -w | --word-regexp | Aplica grep asegurándose de que el PATRÓN coincida con una palabra completa (equivalente a delimitar el patrón con \< y \>); sin efecto si se usa junto a -x
|
grep -w 'error' syslog |
| -x | --line-regexp | Aplica grep asegurándose de que el PATRÓN coincida con la línea completa (equivalente a que el patrón comience con ^ y termine con $) |
grep -x '#\?es_MX.*' /etc/locale.gen |
| -r | --recursive | Aplica grep recursivamente sobre el DIRECTORIO, siguiendo solo los enlaces simbólicos especificados en la línea de comandos | grep -r '[0-9]\{10\}' $(xdg-user-dir DOCUMENTS) |
| -R | --dereference-recursive | Aplica grep recursivamente sobre el DIRECTORIO, siguiendo todos los enlaces simbólicos | grep -R '[0-9]\{10\}' $(xdg-user-dir DOCUMENTS) |
| -q | --quiet | Aplica grep sin imprimir nada en stdout. Retorna exit code 0 si hay mínimo una coincidencia, incluso si se detectó un error; en caso contrario, exit code 1 | grep -q 'contraseña' -r $(xdg-user-dir DOCUMENTS) $(xdg-user-dir DESKTOP) |
| Opción Corta | Opción Larga | Descripción | Ejemplo |
|---|---|---|---|
| -c | --count | Suprime el output normal; en su lugar, imprime el número de líneas que coincidieron con el PATRÓN para cada ARCHIVO. Con -v, cuenta las líneas que no coinciden |
grep -c 'FIX:' project/src/* |
| -L | --files-without-match | Imprime únicamente los nombres de los ARCHIVOS que no contienen ninguna coincidencia con el PATRÓN | grep -L 'TODO' src/*.rs |
| -l | --files-with-matches | Imprime únicamente los nombres de los ARCHIVOS que contienen al menos una coincidencia con el PATRÓN; detiene el escaneo de cada archivo en la primera coincidencia | grep -l 'eval' src/*.js |
| -o | --only-matching | Imprime únicamente las partes no vacías de cada línea que coinciden con el PATRÓN, cada una en una línea separada | grep -o '[0-9]\+' archivo.txt |
| -m NUM | --max-count=NUM | Detiene la búsqueda en un ARCHIVO después de NUM líneas coincidentes. Con -v, detiene tras NUM líneas no coincidentes. Con -c, no reporta un conteo mayor que NUM |
grep -m 5 'error' syslog |
| Opción Corta | Opción Larga | Descripción | Ejemplo |
|---|---|---|---|
| -H | --with-filename | Imprime el nombre del archivo por cada coincidencia. Opción predeterminada cuando hay más de un archivo en la búsqueda | grep -H 'docker' *.txt *.md |
| -h | --no-filename | Suprime el nombre del archivo en el output. Opción predeterminada cuando hay solo un archivo (o solo stdin) en la búsqueda | grep -h 'docker' *.{txt,md} |
| -n | --line-number | Imprime el número de línea (base 1) junto a cada coincidencia | grep -n 'TODO' src/*.c |
| -I | Trata los archivos binarios como si no tuvieran coincidencias (equivalente a --binary-files=without-match); útil para excluirlos en búsquedas recursivas |
grep -RI 'password' ~/projects |
| Opción Larga | Descripción | Ejemplo |
|---|---|---|
| --include=GLOB | Limita la búsqueda recursiva a los archivos cuyo nombre coincide con el patrón GLOB | grep -r 'fn ' --include="*.rs" project/ |
| --exclude=GLOB | Excluye de la búsqueda los archivos cuyo nombre coincide con el patrón GLOB | grep -r 'TODO' --exclude="*.min.js" src/ |
| --exclude-dir=GLOB | Excluye de la búsqueda recursiva los directorios cuyo nombre coincide con el patrón GLOB | grep -r 'fn ' --exclude-dir="tests" src/ |
| --exclude-from=ARCHIVO | Excluye los archivos cuyos nombres coincidan con cualquier patrón listado en ARCHIVO | grep -r 'key' --exclude-from=.gitignore . |
A continuación se muestran una serie de ejemplos aplicando cada una de las
opciones para la sintaxis del patrón,
exceptuando la opción por defecto -G.
Se desea buscar las palabras "solo", "sólo" y "solamente" dentro del archivo
Reporte.txt:
# Usando operador lógico OR
grep 'solo\|sólo\|solamente' Reporte.txt
grep -E 'solo|sólo|solamente' Reporte.txt
grep -P 'solo|sólo|solamente' Reporte.txt
# Usando agrupación y el operador lógico OR `|`
grep 's\(o\|ó\)lo\|solamente' Reporte.txt
grep -E 's(o|ó)lo|solamente' Reporte.txt
grep -P 's(o|ó)lo|solamente' Reporte.txt
# Especificando múltiples PATRONES con la opción `-e PATRÓN`
grep -e 'solo' -e 'sólo' -e 'solamente' Reporte.txt
grep -E -e 'solo' -e 'sólo' -e 'solamente' Reporte.txt
grep -P -e 'solo' -e 'sólo' -e 'solamente' Reporte.txt
grep -F -e 'solo' -e 'sólo' -e 'solamente' Reporte.txtSe desea buscar recursivamente listas enumeradas en archivos markdown (extensión
.md), imprimiendo sus respectivos números de línea:
# Definiendo clases
grep -n '^[ \t]*[0-9]\+\.' -r --include="*.md"
grep -E -n '^[ \t]*[0-9]+\.' -r --include="*.md"
grep -P -n '^[ \t]*[0-9]+\.' -r --include="*.md"
# Usando solo clases predefinidas POSIX
grep -n '^[[:blank:]]*[[:digit:]]\+\.' -r --include="*.md"
grep -E -n '^[[:blank:]]*[[:digit:]]+\.' -r --include="*.md"
grep -P -n '^[[:blank:]]*[[:digit:]]+\.' -r --include="*.md"
# Usando clases predefinidas PCRE
grep -P -n '^[ \t]*\d+\.' -r --include="*.md"Se desea buscar recursivamente (incluyendo todos los enlaces simbólicos) todas
las líneas que contengan cabeceras HTML (i.e., <h1>...</h1>, <h2>...</h2>,
..., <h6>...</h6>) en el directorio raíz del servidor HTTP de Nginx (e.g.,
/usr/share/nginx/html), excluyendo archivos binarios.
Tip
Para información de cómo levantar y configurar un servidor HTTP con Nginx
véase Nginx Beginner's Guide
(y/o ejecuta man 8 nginx o info 8 nginx) y el archivo de configuración de
Nginx (e.g., /etc/nginx/nginx.conf).
# Definiendo clases, grupos y usando _back references_ (i.e., `\1`)
grep -I '<h\([1-6]\)>.*</h\1>' -R "/usr/share/nginx/html"
grep -E -I '<h([1-6])>.*</h\1>' -R "/usr/share/nginx/html"
grep -P -I '<h([1-6])>.*</h\1>' -R "/usr/share/nginx/html"Se desea listar recursivamente todos aquellos archivos fuente de JS y TS (i.e.,
extensión .js y .ts) que contengan la función insegura eval() dentro de
los directorios repo/public/src/client y repo/public/src/server.
# Usando `-r` con `--include` para cada extensión y los directorios como argumentos
grep -rl 'eval(.*)' --include="*.js" --include="*.ts" repo/public/src/client repo/public/src/server
grep -E -rl 'eval\(.*\)' --include="*.js" --include="*.ts" repo/public/src/client repo/public/src/server
grep -P -rl 'eval\(.*\)' --include="*.js" --include="*.ts" repo/public/src/client repo/public/src/server
# Usando el comando `find` + `-exec` y `grep`
find repo/public/src/client repo/public/src/server \
-type f \( -name "*.js" -o -name "*.ts" \) \
-exec grep -l 'eval(.*)' {} \;Se desea buscar todas las funciones definidas dentro de un proyecto de Cargo
(Rust) ubicado en la carpeta project, excluyendo el directorio
project/tests.
# Definiendo clases
grep -rn 'fn [A-Za-z_][A-Za-z0-9_]*(' \
--include="*.rs" \
--exclude-dir="tests" \
project/
# Usando clases predefinidas POSIX
grep -E -rn 'fn [A-Za-z_][[:alnum:]_]*\(' \
--include="*.rs" \
--exclude-dir="tests" \
project/
# Usando clases predefinidas PCRE
grep -P -rn 'fn [A-Za-z_]\w*\(' \
--include="*.rs" \
--exclude-dir="tests" \
project/Se desea buscar todos los verbos en infinitivo (i.e., con sufijo ar, er,
ir) de cinco a ocho letras que comiencen con una vocal dentro de
diccionario.txt, usando el modo case insensitive (insensible a mayúsculas):
# Usando word boundaries con `\<` y `\>`
grep -i '\<[aeiou][a-z]\{3,5\}\(ar\|er\|ir\)\>' diccionario.txt
grep -i -E '\<[aeiou][a-z]{3,5}(ar|er|ir)\>' diccionario.txt
grep -i -P '\<[aeiou][a-z]{3,5}(ar|er|ir)\>' diccionario.txt
# Usando word boundaries con `\b` (solo PCRE)
grep -i -P '\b[aeiou][a-z]{3,5}(ar|er|ir)\b' diccionario.txt
# Usando `-w` (--word-regexp), evita escribir word boundaries explícitos
grep -i -w '[aeiou][a-z]\{3,5\}\(ar\|er\|ir\)' diccionario.txt
grep -i -w -E '[aeiou][a-z]{3,5}(ar|er|ir)' diccionario.txt
grep -i -w -P '[aeiou][a-z]{3,5}(ar|er|ir)' diccionario.txtEs importante aprender el comando grep, especialmente porque suele venir
preinstalado en sistemas operativos Unix y Unix-like (e.g., Linux). Sin embargo,
existen varias alternativas interesantes:
| Herramienta | Comando | Descripción | Preinstalado |
|---|---|---|---|
| ripgrep | rg |
Herramienta de búsqueda escrita en Rust. Recursiva por defecto, respeta .gitignore, soporta PCRE2 y tiene soporte Unicode completo. Es generalmente la más rápida entre las alternativas populares |
No |
| The Silver Searcher | ag |
Escrita en C, compatible con ack, respeta .gitignore y .hgignore. Muy rápida aunque su desarrollo está prácticamente inactivo |
No |
| ack | ack |
Escrita en Perl, orientada a búsqueda en código fuente. Reconoce tipos de archivo por extensión y contenido, ignorando directorios irrelevantes (e.g., .git, node_modules) por defecto |
No |
| ugrep | ugrep |
Drop-in replacement de GNU grep compatible con BRE, ERE y PCRE. Incluye TUI interactiva, búsqueda booleana (AND/OR/NOT), búsqueda difusa (fuzzy), y soporte para archivos comprimidos y PDFs | No |
| git grep | git grep |
Variante de grep integrada en Git. Busca únicamente en archivos rastreados por el repositorio; no requiere instalación adicional en sistemas con Git |
No |
| Herramienta | Comando | Descripción | Preinstalado |
|---|---|---|---|
| ripgrep-all | rga |
Extensión de ripgrep que permite buscar también dentro de PDFs, e-books, documentos de ofimática y archivos comprimidos usando preprocessors
|
No |
| pdfgrep | pdfgrep |
Herramienta para buscar texto dentro de archivos PDF con sintaxis similar a grep; utiliza internamente poppler para extraer el texto |
No |
| pgrep | pgrep |
Busca procesos en ejecución por nombre o patrón (expresiones regulares) y muestra sus PIDs; forma parte del paquete procps en la mayoría de sistemas |
Sí |
| zgrep | zgrep |
Herramienta que permite usar grep directamente sobre archivos comprimidos en formato GZIP |
Sí |
| bzgrep | bzgrep |
Variante de zgrep para archivos comprimidos en formato BZIP2 |
Sí |
| xzgrep | xzgrep |
Variante de zgrep para archivos comprimidos en formato XZ |
Sí |
- Beyond grep — Tabla comparativa de herramientas similares a grep
- Expresiones Regulares (RegEx)
- Wildcards (Globbing Patterns)
- grep(1) man page
- glob(7) man page
- regex(7) man page
-
Akamai (s.f.). Using grep. Operating Systems Fundamentals. https://www.coursera.org/learn/akamai-operating-systems/lecture/nSmSk/using-grep
-
Free Software Foundation (21 de marzo de 2025). grep(1). https://man.archlinux.org/man/core/grep/grep.1.en
-
ack! (s.f.). Feature comparison of ack, ag, git-grep, GNU grep and ripgrep. https://beyondgrep.com/feature-comparison/
- Definición y Estructura de un Shell
- Los Diferentes Tipos de Shell
- Definición y Sintaxis de un Comando
- Variables, Alias y Funciones
- Comandos de Utilidad y Consulta
- Linux como Sistema Multiusuario
- Introducción a los Usuarios y Grupos
- Gestión de Usuarios
- Gestión de Grupos
- Gestión de Contraseñas
- Búsqueda de Información de Usuarios y Grupos con
getent
- Atributos de Archivos: Propiedad y Permisos de los Archivos
- Cambio de Propiedad y Permisos
umask: Permisos Predeterminados de Archivos- Cambio de Identidad y Privilegios
- Gestión de Paquetes (Package Management)
- Compresión y Archivado de Archivos
- Optimización y Conversion de Archivos