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.

Origen

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». Hay varios argumentos que se pueden usar con grep para modificar el comportamiento por defecto.

Uso

$ grep [opciones] [expresión regular] [archivo]

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 Microsoft Windows (en ese sistema operativo, el proyecto Gnuwin32 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.

Parámetros comunes

-núm Las líneas concordantes se mostrarán acompañadas de núm líneas
anteriores y posteriores. Sin embargo, grep nunca mostrará
cualquier línea dada más de una vez.
-A núm , --after-context=NÚM
Muestra núm líneas de contexto después de las que concuerden con
el patrón.
-B núm , --before-context=NÚM
Muestra núm líneas de contexto antes de las que concuerden con
el patrón.
-C, --context
Equivalente a -2.
-V, --versión
Muestra el número de versión de grep en la salida estándar de
errores. Este número de versión debería incluirse en todos los
informes de fallos (vea más abajo).
-b, --byte-offset
Muestra el desplazamiento en bytes desde el principio del
fichero de entrada antes de cada línea de salida.
-c, --count
Suprime la salida normal; en su lugar muestra el número de
líneas que concuerdan con el patrón para cada fichero de
entrada. Con la opción -v, --revert-match (vea más abajo),
muestra el número de líneas que no concuerden.
-E patrón,--regexp=PATRÓN
Emplea patrón como el patrón; útil para proteger patrones que
comiencen con -.
-f fichero,--file=FICHERO
Obtiene el patrón de fichero.
-h, --no-filename
Suprime la impresión de los nombres de ficheros antes de las
líneas concordantes en la salida, cuando se busca en varios
ficheros.
-i, --ignore-case
No hace caso de si las letras son mayúsculas o minúsculas ni en
el patrón ni en los ficheros de entrada.
-L, --files-without-match
Suprime la salida normal; en su lugar muestra el nombre de cada
fichero de entrada donde no se encuentre ninguna concordancia y
por lo tanto de cada fichero que no produciría ninguna salida.
La búsqueda se detendrá al llegar a la primera concordancia.
-l, --files-with-matches
Suprime la salida normal; en su lugar muestra el nombre de cada
fichero de entrada que produciría alguna salida. La búsqueda se
detendrá en la primera concordancia.
-n, --line-number
Prefija cada línea de salida con el número de línea de su
fichero de entrada correspondiente.
-q, --quiet
Silencioso; suprime la salida normal. La búsqueda finaliza en la
primera concordancia.
-s, --silent
Suprime los mensajes de error sobre ficheros que no existen o no
se pueden leer.
-v, --revert-match
Invierte el sentido de la concordancia, para seleccionar las
líneas donde no las hay.
-w, --word-regexp
Selecciona solamente aquellas líneas que contienen concordancias
que forman palabras completas. La comprobación consiste en que
la cadena de caracteres concordante debe estar al principio de
la línea o precedida por un carácter que no forme parte de una
palabra. De forma similar, debe estar o al final de la línea o
ser seguida por un carácter no constituyente de palabra. Los
caracteres que se consideran como parte de palabras son letras,
dígitos y el subrayado.
-x, --line-regexp
Selecciona solamente aquellas concordancias que constan de toda
la línea.
-y Sinónimo obsoleto de -i.
-U, --binary
Trata el(los) fichero(s) como binario(s). De forma predetermi-
nada, bajo MS-DOS y MS-Windows, grep intenta adivinar el tipo
del fichero mirando los contenidos de los primeros 32 kB leídos
de él. Si grep decide que el fichero es de texto, quita los car-
acteres CR (retorno de carro) de los contenidos originales del
fichero (para que las expresiones regulares con ^ y $ funcionen
correctamente). Al especificar -U deshabilitamos este intento de
adivinación del tipo del fichero, haciendo que todos se lean y
pasen al mecanismo de concordancia tal cuales; si el fichero lo
es de texto y tiene al final de cada línea el par de caracteres
CR/LF, esto hará que algunas expresiones regulares fallen. Esta
opción sólo tiene sentido en MS-DOS y MS-Windows.
-u, --unix-byte-offsets
Informa de desplazamientos de bytes al estilo de Unix. Esta
opción hace que grep muestre los desplazamientos de bytes como
si el fichero fuera de texto al estilo de Unix; o sea, sin los
caracteres CR al final de cada línea. Esto producirá resultados
idénticos a ejecutar grep en un sistema Unix. Esta opción no
tiene efecto a menos que se dé también la opción -b; sólo tiene
sentido en MS-DOS y MS-Windows.
-o, --only-matching
Muestra sólo la cadena buscada por el PATRON


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):

grep tal *

Para mostrar todas las líneas que no contengan la cadena «tal», se usa «-v»:

grep -v tal *

Para mostrar sólo el nombre de tales archivos, se usa «-l»:

grep -l tal *

Para mostrar sólo el nombre de los archivos que no contienen la cadena, se usa «-L»:

grep -L tal *

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»:

grep -r tal .

La opción -r puede no estar disponible en todas las plataformas Unix.

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):

grep '^Ahora.*siempre *$'

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:

ps -ef | grep $USER

o

ps -efa | grep $USER

Mostrará las cuentas de usuaros que presenten actividad en ese momento.

Variantes

Existen muchos derivados de grep; por ejemplo Agrep, que significa approximate grep (grep aproximado), y 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 regresa los elementos de la lista que encajan con dicha expresión.

El sistema Windows tiene una utilidad llamada «findstr», que aproxima las funciones de «grep».

Enlaces externos