Generador de comandos grep y ripgrep
Crea búsquedas con grep y ripgrep con inclusiones, exclusiones y contexto.
Acerca de esta herramienta
Indica el patrón, dónde buscar, qué archivos y carpetas incluir u omitir y qué mostrar (líneas con contexto, solo las coincidencias, recuentos o nombres de archivo). Obtén los comandos de GNU grep y ripgrep equivalentes con cada opción explicada, y prueba el patrón con un texto de ejemplo en la propia página.
Cómo se usa
- Escribe qué buscar. Varias líneas se convierten en varios patrones, y basta con que coincida cualquiera de ellos.
- Elige sintaxis regex, básica, texto plano o Perl, y opciones como ignorar mayúsculas y minúsculas o palabras completas.
- Indica dónde buscar y qué archivos y carpetas incluir u omitir.
- Elige qué mostrar, prueba el patrón con un texto de ejemplo y copia el comando grep o ripgrep.
Preguntas
- ¿Cómo busco de forma recursiva pero omitiendo algunas carpetas?
- Añade --exclude-dir por cada carpeta, por ejemplo grep -r --exclude-dir=.git --exclude-dir=vendor pattern . Con ripgrep, todo lo que aparece en .gitignore se omite automáticamente, y -g '!folder/' omite más.
- ¿Cómo busco solo en ciertos tipos de archivo?
- Con grep, añade --include='*.log' (entre comillas, para que la shell no expanda el asterisco). Con ripgrep, usa -g '*.log' o un tipo integrado como -t py o -t java.
- ¿Qué diferencia hay entre grep -E y el grep normal?
- El grep normal usa expresiones regulares básicas, donde + ? | ( ) son caracteres normales salvo que se escapen con una barra invertida. -E cambia a la sintaxis extendida, donde funcionan como operadores, igual que en la mayoría de los lenguajes de programación.
- ¿Debo usar grep o ripgrep?
- ripgrep (rg) es mucho más rápido en proyectos grandes, busca de forma recursiva por defecto y respeta .gitignore. grep está instalado en todos los sistemas Unix, lo que importa en servidores y scripts.
- ¿Cómo muestro las líneas alrededor de cada coincidencia?
- Usa -C 3 para tres líneas de contexto a cada lado, o -B y -A para antes y después por separado. La vista previa de aquí muestra las mismas líneas de contexto.
- ¿Cómo busco con grep un patrón que empieza por un guion?
- grep lo interpretaría como una opción. Pon -e delante, como en grep -e "-v" notes.txt, o termina las opciones con dos guiones: grep -- "-v" notes.txt. La herramienta añade -e automáticamente siempre que un patrón empieza por un guion.
- ¿Cómo busco dentro de archivos de log comprimidos .gz?
- El grep normal solo ve bytes comprimidos, por eso aquí *.gz se excluye por defecto. Usa zgrep, que acepta la mayoría de las opciones de grep, por ejemplo zgrep -i "timeout" /var/log/app.log.2.gz. Para una carpeta entera de logs rotados, zgrep -i timeout /var/log/app.log* busca a la vez en los archivos normales y en los comprimidos.
- ¿Cómo cuento coincidencias en lugar de líneas coincidentes?
- grep -c cuenta líneas, así que una línea con tres coincidencias cuenta una vez. Para contar cada aparición, muestra cada coincidencia en su propia línea y cuéntalas: grep -o "error" app.log | wc -l. Añade -i en los dos casos si las mayúsculas varían.
Cómo buscar varias palabras con grep
Para encontrar líneas que contengan cualquiera de varias palabras, usa la sintaxis extendida: grep -E "error|warn" app.log. Lo mismo funciona con un -e por patrón, grep -e error -e warn app.log, que es lo que obtienes aquí cuando escribes cada patrón en su propia línea. En la sintaxis básica necesitarías error\|warn, una extensión de GNU que el grep BSD de macOS puede no aceptar.
grep no tiene operador AND. Para encontrar líneas que contengan ambas palabras en cualquier orden, pasa el resultado de una búsqueda a otra con una tubería: grep -i payment app.log | grep -i timeout. En GNU grep, -P admite lookaheads, como en grep -P "^(?=.*payment)(?=.*timeout)", pero -P no está disponible en el grep que trae macOS por defecto. Para encontrar archivos, en lugar de líneas, que contengan ambas palabras, encadena grep -rl con xargs.
¿Por qué grep no encuentra nada?
Primero revisa las comillas. Sin comillas, la shell expande * y $ antes de que grep vea el patrón, así que ponlo siempre entre comillas dobles, o entre comillas simples si contiene $. Después revisa la sintaxis: en grep básico, + ? y | son caracteres normales salvo que añadas -E. Y un punto coincide con cualquier carácter, así que busca un número de versión literal con grep -F "1.2.3".
Los archivos con finales de línea de Windows rompen los patrones anclados con $, porque cada línea termina con un retorno de carro invisible. Tenlo en cuenta con grep -P "foo\r?$" o convierte antes el archivo con dos2unix. Si grep muestra “binary file matches”, ha encontrado un byte NUL; añade -a para buscar en el archivo como texto. Prueba el patrón con texto de ejemplo aquí, o en el Probador de regex, antes de ejecutarlo sobre archivos reales.
Equivalentes en ripgrep de las opciones habituales de grep
La mayoría de las opciones son iguales en ambos: -i, -w, -v, -c, -l, -o, -m y las opciones de contexto -A, -B y -C. Las diferencias son las que confunden. ripgrep muestra los números de línea por defecto en una terminal, así que -N los oculta. Para ocultar los nombres de archivo, grep usa -h pero ripgrep usa -I, y en grep -I significa omitir los archivos binarios. Para seguir los enlaces simbólicos, grep usa -R y ripgrep usa -L.
ripgrep busca de forma recursiva y omite los archivos ocultos y todo lo que esté en .gitignore; --hidden y --no-ignore desactivan ese comportamiento. En lugar de --include y --exclude tiene una sola opción: rg -g "*.py" TODO busca solo en archivos de Python, y un glob que empieza por ! excluye. El comando generado lo pone entre comillas simples para que bash no interprete ! como historial. Con -S, smart case, un patrón en minúsculas ignora mayúsculas y minúsculas, y uno con mayúsculas no. grep no tiene smart case, así que el comando grep usa -i en su lugar.
¿Algo no funciona o un resultado parece incorrecto? Informar de un problema con esta herramienta