Tutorial completo del comando grep: buscar patrones en archivos con -i, -v, -c y -n

DUGLAS MORENODUGLAS MORENO 👁 67

Introducción

El comando grep es una de las herramientas más poderosas y usadas en entornos Unix‑like para buscar patrones de texto dentro de archivos. Ya sea que estés depurando un log, revisando configuraciones o simplemente intentando localizar una función en tu código fuente, saber usar grep de forma eficiente te ahorra tiempo y esfuerzo.

Este tutorial está dirigido a desarrolladores, administradores de sistemas y cualquier persona que trabaje con la línea de comandos en Linux o macOS. Al finalizar, comprenderás la sintaxis básica de grep, conocerás en profundidad las opciones -i, -v, -c y -n, y podrás combinarlas para realizar búsquedas más sofisticadas. Además, verás ejemplos concretos con la salida esperada, lo que te permitirá reproducir los comandos en tu propio entorno.


¿Qué es grep y cómo funciona?

grep proviene de la expresión global regular expression print. En esencia, lee línea por línea los archivos especificados (o la entrada estándar) y muestra aquellas que coinciden con el patrón dado. El patrón puede ser una cadena literal o una expresión regular básica.

La forma más simple es:

grep patron archivo

Si el patrón se encuentra en alguna línea, esa línea se imprime en la salida estándar. Si no hay coincidencias, grep no produce salida y devuelve un código de estado distinto de cero, lo que permite usarlo en condicionales de shell.


Sintaxis básica y elementos importantes

Antes de entrar en las opciones específicas, repasemos los componentes que forman parte de casi cualquier invocación de grep:

  • patron: la cadena o expresión regular que queremos buscar.
  • archivo: uno o más archivos a examinar. Si se omite, grep lee de la entrada estándar (útil en tuberías).
  • opciones: modificadores que cambian el comportamiento de búsqueda (ignorar caso, invertir, contar, etc.).

Algunas convenciones útiles:

  • Siempre es buena práctica encerrar el patrón entre comillas simples (') para evitar que el shell interprete caracteres especiales como *, $ o \.
  • Cuando buscas en varios archivos, puedes usar comodines (*.log, src/**/*.js) o pasar una lista explícita.
  • El uso de --color=auto (activado por defecto en muchas distribuciones) resalta las coincidencias, lo que facilita la lectura.

Opción -i: ignorar mayúsculas y minúsculas

La opción -i hace que grep ignore las diferencias entre mayúsculas y minúsculas al comparar el patrón con cada línea. Esto es especialmente útil cuando no sabes exactamente cómo está escrito el texto o cuando trabajas con logs que pueden variar en la capitalización.

Ejemplo 1

Supongamos que tienes un archivo saludo.txt con el siguiente contenido:

Hola Mundo
 hola mundo
HOLA MUNDO
Buenos días

Ejecutamos:

grep -i 'hola' saludo.txt

Salida esperada:

Hola Mundo
 hola mundo
HOLA MUNDO

Todas las líneas que contienen la secuencia hola sin importar caso aparecen en la salida.

Ejemplo 2: combinación con otras opciones

grep -i -n 'error' /var/log/syslog

Aquí -i ignora mayúsculas/minúsculas y -n muestra el número de línea donde se encontró cada coincidencia (veremos -n más adelante).


Opción -v: invertir la coincidencia

La opción -v (de invert) hace que grep muestre únicamente las líneas que no coinciden con el patrón. Es ideal para filtrar fuera ruido o para ver qué líneas no cumplen cierto criterio.

Ejemplo 1

Volviendo al archivo saludo.txt:

grep -v 'hola' saludo.txt

Salida esperada:

Buenos días

Solo la línea que no contiene la palabra hola (en cualquier caso, ya que no usamos -i) se muestra.

Ejemplo 2: excluir comentarios en un archivo de configuración

Muchos archivos de configuración usan # para iniciar comentarios. Para ver únicamente las líneas de configuración activa:

grep -v '^#' /etc/ssh/sshd_config

El patrón ^# significa "línea que empieza con #" (el ^ es ancla de inicio). Con -v obtenemos todo lo que no es un comentario.


Opción -c: contar coincidencias

La opción -c (de count) hace que grep devuelva únicamente el número de líneas que coinciden con el patrón, en lugar de imprimir las líneas mismas. Es útil para obtener rápidamente estadísticas.

Ejemplo 1

Contar cuántas veces aparece la palabra foo en un archivo de código:

grep -c 'foo' programa.py

Supongamos que la salida es:

5

Indicando que foo se encontró en cinco líneas distintas.

Ejemplo 2: contar en múltiples archivos

grep -c 'TODO' src/**/*.js

Esta línea mostrará, para cada archivo que coincida con el patrón de ruta, el número de líneas que contienen TODO, algo como:

src/components/Button.js:3
src/utils/helpers.js:0
src/App.js:7

Cada línea tiene el formato archivo:cantidad. Si un archivo no tiene coincidencias, el contador será cero.


Opción -n: mostrar número de línea

La opción -n (de number) antecede a cada línea de salida con su número de línea dentro del archivo (o archivos). Esto es invaluable cuando necesitas ubicar rápidamente dónde ocurre una coincidencia para editarla o inspeccionarla.

Ejemplo 1

Buscar la palabra funcion en un script y mostrar el número de línea:

grep -n 'funcion' script.sh

Supongamos que el contenido es:

1: #!/bin/bash
2: echo "Inicio"
3: funcion saludar {
4:   echo "Hola"
5: }
6: funcion despedir {
7:   echo "Adiós"
8: }
9: saludar
10: despedir

Salida esperada:

3: funcion saludar {
6: function despedir {

Observa que el número de línea aparece seguido de dos puntos y luego la línea completa.

Ejemplo 2: combinar -n con -i y -c

grep -ni 'error' /var/log/auth.log | head -5

Esta cadena busca error ignorando caso, muestra número de línea y, mediante head -5, limita la salida a las primeras cinco coincidencias.


Combinando opciones: poder real de grep

La verdadera fuerza de grep radica en la capacidad de combinar varias opciones para adaptar la búsqueda a necesidades específicas. A continuación, algunos patrones de uso frecuente.

1. Ignorar caso y mostrar número de línea

grep -ni 'usb' dmesg.log

Útil para revisar mensajes del kernel sobre dispositivos USB sin preocuparte por mayúsculas/minúsculas y sabiendo exactamente en qué línea aparecen.

2. Contar líneas que no contienen un patrón

grep -vc '^$' archivo.txt

Aquí -v invierte la coincidencia (líneas vacías), -c cuenta, y el patrón ^$ coincide con líneas completamente vacías. El resultado es el número de líneas no vacías.

3. Mostrar líneas con coincidencia, número de línea y excluir ciertos archivos

grep -rn 'password' --exclude-dir=.git --exclude='*.md' .
  • -r (o -R) hace la búsqueda recursiva en directorios.
  • -n agrega número de línea.
  • --exclude-dir=.git evita entrar al directorio de control de versiones.
  • --exclude='*.md' ignora archivos Markdown.

Esta combinación es típica cuando se busca credenciales expuestas en un código fuente.

4. Usar expresiones regulares simples con -E (grep extendido)

Aunque no es parte de las opciones solicitadas, vale la pena mencionar que grep soporta expresiones regulares básicas por defecto y extendidas con -E o egrep. Por ejemplo, para buscar líneas que empiecen con error o warn:

grep -iE '^(error|warn)' /var/log/syslog

El patrón ^(error|warn) significa "línea que comienza con error o warn" y -i lo hace insensible a mayúsculas.


Ejemplos de búsquedas simples con salida esperada

A continuación, se presentan varios escenarios comunes, cada uno con el comando, una breve explicación y la salida que deberías obtener si el archivo de ejemplo contiene el contenido mostrado.

Archivo de ejemplo: notas.txt

Juan: 8.5
María: 9.0
Pedro: 7.5
Ana: 10.0
Luis: 8.0

a) Buscar un nombre exacto (case‑sensitive)

grep 'María' notas.txt

Salida:

María: 9.0

b) Buscar sin distinguir mayúsculas/minúsculas

grep -i 'juan' notas.txt

Salida:

Juan: 8.5

c) Invertir la coincidencia (mostrar todo menos las líneas que contienen un patrón)

grep -v '10.0' notas.txt

Salida:

Juan: 8.5
María: 9.0
Pedro: 7.5
Luis: 8.0

d) Contar cuántas líneas tienen una nota mayor o igual a 9 (usando un patrón simple)

grep -c '[9-9]\.0' notas.txt

Explicación: el patrón [9-9]\.0 coincide con 9.0. Salida:

2

e) Mostrar número de línea junto con la coincidencia

grep -n 'Pedro' notas.txt

Salida:

3: Pedro: 7.5

f) Combinar -i, -n y -v

grep -inv 'luis' notas.txt

Esto busca líneas que no contengan luis (ignorando caso) y muestra su número de línea.

Salida esperada:

1: Juan: 8.5
2: María: 9.0
3: Pedro: 7.5
4: Ana: 10.0

g) Buscar en varios archivos a la vez

Supongamos que tienes otro archivo notas2.txt con:

Carlos: 6.5
Laura: 9.5

Ejecutamos:

grep -n '9.' notas.txt notas2.txt

Salida:

notas.txt:2: María: 9.0
notas2.txt:2: Laura: 9.5

Cada línea muestra el archivo de origen, el número de línea y el contenido.


Buenas prácticas y errores comunes

Buenas prácticas

  1. Always quote your pattern – Evita que el shell expanda caracteres como *, ? o $.
  2. Preferir -i cuando la sensibilidad a mayúsculas no es crítica – Reduce falsos negativos.
  3. Usar -n en combinación con editores – Muchos editores (vim, vscode, etc.) aceptan la forma archivo:línea para abrir directamente en esa posición.
  4. Aprovechar --color=auto – Facilita la visualización, especialmente en salidas largas.
  5. Limitar la búsqueda con --include o --exclude – Cuando trabajas con árboles de directorios grandes, reducir el alcance mejora el rendimiento.
  6. Combinar con otras herramientas – Usa grep en tuberías con sort, uniq, awk o sed para procesar resultados más avanzados.

Errores comunes

  • Olvidar escapar el punto – En expresiones regulares básicas, . coincide con cualquier carácter. Si quisieras buscar literalmente un punto, debes escribir \. o usar -F (grep fijo) para tratar el patrón como cadena literal.
  • Confundir -v con exclusión de archivos-v invierte la coincidencia de líneas, no excluye archivos. Para excluir directorios usa --exclude-dir.
  • Asumir que -c cuenta coincidencias por línea-c cuenta líneas que contienen al menos una coincidencia; si una línea tiene el patrón varias veces, sigue contando como una.
  • Usar comillas dobles y permitir expansión de variables – Si el patrón contiene $, el shell intentará sustituirlo por una variable de entorno. Usa comillas simples o escapa el signo de dólar.
  • No revisar el código de retorno – En scripts, verificar $? después de grep te permite saber si se encontró alguna coincidencia (0) o no (1 o mayor).

Conclusión

En este tutorial hemos explorado a fondo el comando grep, centrándonos en las opciones -i, -v, -c y -n, pero también hemos visto cómo combinarlas y usarlas en contextos reales. Has aprendido:

  • Cómo realizar búsquedas simples y sensibles o insensibles a mayúsculas.
  • Cómo invertir la coincidencia para filtrar fuera ruido.
  • Cómo contar coincidencias y obtener estadísticas rápidas.
  • Cómo mostrar el número de línea para localizar rápidamente ocurrencias.
  • Estrategias para combinar opciones y lograr búsquedas más precisas.
  • Buenas prácticas para evitar errores comunes y mejorar la eficiencia.

Con estos conocimientos, podrás incorporar grep en tus scripts de automatización, en revisiones de logs, en auditorías de código y en cualquier situación donde necesites localizar información textual de forma rápida y confiable. La próxima vez que te enfrentes a un archivo grande o a un conjunto de documentos, recuerda que grep es tu aliado: ágil, potente y siempre disponible en la terminal.

Si deseas seguir profundizando, te recomendamos experimentar con expresiones regulares extendidas (-E o egrep), con la opción -o para mostrar solo la parte coincidente, y con rg (ripgrep), una alternativa moderna que ofrece mayor velocidad y características adicionales. Pero por ahora, tienes una base sólida para usar grep como un verdadero profesional de la línea de comandos.


Comentarios (0)

Sé el primero en comentar.

Dejá tu comentario