Skip to content

03 El Comando grep

Alan edited this page Jun 13, 2026 · 1 revision

El Comando grep

Acerca del 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.

Sintaxis del Comando grep

grep [OPCIONES]... PATRONES [ARCHIVO]...

grep [OPCIONES]... -e PATRONES ... [ARCHIVO]...

grep [OPCIONES]... -f PATTERN_FILE ... [ARCHIVO]...

Opciones del Comando grep

Opciones para la Sintaxis del Patrón

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.md
grep -G '^[[:digit:]]\+.' README.md
-E --extended-regexp Interpreta los PATRONES como Extended Regular Expressions (ERE) grep -E '^[0-9]+.' README.md
grep -E '^[[:digit:]]+.' README.md
-P --perl-regexp Interpreta los PATRONES como Perl-Compatible Regular Expressions (PCRE) grep -P '^[0-9]+.' README.md
grep -P '^\d+.' README.md
-F --fixed-strings Interpreta los PATRONES como strings literales, es decir, sin interpretarlos como RegEx grep -F '^[0-9]\+.' README.md
grep -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

Opciones de Control de Coincidencias

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)

Opciones de Control del Output

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

Opciones de Control del Prefijo del Output

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

Opciones de Filtrado de Archivos

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 .

Ejemplos del Comando grep

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.

Ejemplo 1

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.txt

Ejemplo 2

Se 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"

Ejemplo 3

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"

Ejemplo 4

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(.*)' {} \;

Ejemplo 5

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/

Ejemplo 6

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.txt

Alternativas al Comando grep

Es 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

Herramientas Adicionales Basadas en grep

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
zgrep zgrep Herramienta que permite usar grep directamente sobre archivos comprimidos en formato GZIP
bzgrep bzgrep Variante de zgrep para archivos comprimidos en formato BZIP2
xzgrep xzgrep Variante de zgrep para archivos comprimidos en formato XZ

Recursos Recomendados

Referencias

Introducción a los Sistemas Operativos

Introducción a Linux

Licencias de Software

Archivos y Directorios

Introducción a la CLI

Manipulación de Archivos y Directorios

Documentación y Exploración de Comandos

Redirección

Búsqueda de Archivos y Texto

Editores de Texto de Terminal

Gestión de Usuarios y Grupos

Propiedad y Permisos

Herramientas Esenciales

Hardware

Apéndice

Clone this wiki locally