# Grep

grep es una utilidad de la línea de comandos escrita originalmente para ser usada con el sistema operativo Unix.
Usualmente, grep toma una expresión regular de la línea de comandos, lee la entrada estándar o una lista de archivos, e imprime las líneas que contengan coincidencias para la expresión regular.
Su nombre deriva de un comando en el editor de texto ed que tiene la siguiente forma: g/re/p y significa «hacer una búsqueda global para las líneas que encajen con la expresión regular (regular expression en inglés), e imprimirlas (print en inglés)». Hay varios argumentos que se pueden usar con grep para modificar el comportamiento por defecto.
Existen otros retroacrónimos (incorrectos) para el nombre, entre ellos: General Regular Expression Parser (analizador general de expresiones regulares), General Regular Expression Print (imprimir expresión regular general), y Global Regular Expression Print (imprimir expresión regular global), este último no tan lejano de la realidad.

## Historia

grep es fruto de la filosofía “modular” de Unix: crear pequeños programas altamente especializados en una sola cosa, para luego utilizarlos combinados por medio de tuberías. Eventualmente el programa apareció en otras encarnaciones, como por ejemplo en DOS, actuando como herramienta de apoyo a compiladores.
Han existido varios intentos para darle una interfaz gráfica al programa, pero hasta ahora grep sigue siendo utilizado principalmente en líneas de comandos, mezclado con otros programas como tail, ps, y less.
La versión más popular es GNU grep, que está disponible para diversos sistemas operativos, entre ellos GNU/Linux, y existe el proyecto Gnuwin32, que proporciona una versión de grep para Windows.

## Funcionamiento

grep generalmente ejecuta alguna variante del algoritmo Boyer-Moore (para búsqueda de strings), utilizando expresiones regulares para definir la consulta. Puede manejar archivos, directorios (y subdirectorios), o la entrada estándar (stdin).
El programa es configurable por medio de opciones de invocación, pudiendo (por ejemplo) mostrar las líneas con aciertos, desaciertos, el contexto de la coincidencia, etc.

## Ejemplos

Para mostrar todas las líneas que contienen la cadena «tal» en una lista de archivos (donde «*» representa todos los archivos en el directorio actual):
Para mostrar todas las líneas que no contengan la cadena «tal», se usa «-v»:
Para mostrar sólo el nombre de tales archivos, se usa «-l»:
Para mostrar sólo el nombre de los archivos que no contienen la cadena, se usa «-L»:
Para buscar recursivamente, no sólo en los archivos del directorio actual sino también en los de sus subdirectorios (donde "." representa el directorio actual), se usa «-r»:
En solaris no funciona el parámetro -r. Para obtener la misma funcionalidad, se debe utilizar además el comando «find» y el comando «exec» (Recordemos, el parámetro «-l» mostrará únicamente el nombre del archivo que contenga la cadena "tal"):
La opción -r puede no estar disponible en todas las plataformas Unix. Se debe utilizar así:
Para buscar todas las líneas que comienzan por «Ahora» y terminan con «siempre» seguido de una cantidad arbitraria de espacio en blanco (nótese que el carácter ^ representa el inicio de la línea, así como $ representa el final):
Para hacer que grep lea de la entrada estándar, no se especifica archivo alguno. Por ejemplo, como ps -ef lista todos los procesos actualmente en ejecución, el siguiente comando imprime todos los procesos que está ejecutando el usuario actual:
o
Mostrará las cuentas de usuarios que presenten actividad en ese momento.

### Variantes

Existen muchos derivados de grep; por ejemplo agrep, que significa approximate grep (grep aproximado), que sirve para hacer una búsqueda aproximada de cadenas; fgrep para buscar patrones fijos; egrep para búsquedas que involucren expresiones regulares más complejas; y tcgrep, que utiliza la sintaxis de expresiones regulares de Perl. Todas estas variantes de grep han sido llevadas a diversos sistemas operativos.
Muchos otros comandos contienen la cadena «grep». Por ejemplo pgrep, que muestra los procesos cuyos nombres encajan con cierta expresión regular.
En Perl existe la función grep, que recibe una expresión regular y una lista, y devuelve los elementos de la lista que encajan con dicha expresión.
El sistema Windows tiene una utilidad llamada «findstr», que se aproxima a las funciones de «grep».
El programa de maquetación Adobe InDesign también incluye las funcionalidades de GREP (desde 2007 con la versión CS3 en adelante), en los apartados de "Expresiones GREP" (en buscar y cambiar) y "Estilos GREP" (en estilos de párrafo).