Guía avanzada del usuario

Cómo buscar patrones con grep

Para buscar una determinada cadena de caracteres en un archivo, use el comando grep. La sintaxis básica del comando grep es:

$ grep cadena_de_caracteres archivo

donde cadena_de_caracteres es la palabra o frase que quiere encontrar, y archivo es el archivo que quiere buscar.


Nota -

Una cadena de caracteres está formada por uno o más caracteres, una única letra, una palabra o una frase. Las cadenas de caracteres pueden incluir "espacios en blanco", signos de puntuación, y caracteres invisibles (de control).


Por ejemplo, para buscar el teléfono de Edgar Allan Poe, escriba grep seguido de parte o de la totalidad de su nombre y del archivo que contenga la información:

$ grep Poe extensions
Edgar Allan Poe     x72836
$

Observe que puede haber más de una línea que cumpla con los patrones especificados:

$ grep Allan extensions
David Allan         x76438
Edgar Allan Poe     x72836
$ grep Al extensions
Louisa May Alcott   x74236
David Allan         x76438
Edgar Allan Poe     x72836
$

grep distingue entre mayúsculas y minúsculas; es decir, debe especificar si las entradas van en mayúsculas o minúsculas:

$ grep allan extensions
$ grep Allan extensions
David Allan         x76438
Edgar Allan Poe     x72836
$

Observe que grep no funcionó en el primer intento porque ninguna de las entradas comenzaba por minúscula.

grep como filtro

grep se utiliza muy a menudo como "filtro" con otros comandos. Esto le permite filtrar y eliminar la información inútil que se produce tras ejecutar un comando. Para usar grep como filtro, debe enviar el resultado del comando mediante grep por el canal de comunicación. El símbolo para el canal de comunicación es "|".

El siguiente ejemplo muestra archivos que acaban por ".ps" creados en el mes de mayo:

$ ls -l *.ps | grep May

La primera parte de esta línea de comando,

ls -l *.ps

muestra una lista de archivos:

$ ls -l *.ps
-rw-r--r--  1 elvis       7228 Apr 22 15:07 change.ps
-rw-r--r--  1 elvis       2356 May 22 12:56 clock.ps
-rw-r--r--  1 elvis       1567 Jun 22 12:56 cmdtool.ps
-rw-r--r--  1 elvis      10198 Jun 22 15:07 command.ps
-rw-r--r--  1 elvis       5644 May 22 15:07 buttons.ps
$

La segunda parte,

| grep May

envía la lista por medio de grep, buscando el patrón mayo.:

$ ls -l *.ps | grep May
-rw-r--r--  1 elvis       2356 May 22 12:56 clock.ps
-rw-r--r--  1 elvis       5644 May 22 15:07 buttons.ps
$

grep cadenas de palabras múltiples

Para buscar un patrón que tenga más de una palabra, escriba la cadena entre comillas dobles o sencillas:

$ grep "Louisa May" extensions
Louisa May Alcott     x74236
$

grep puede buscar una cadena de caracteres en un grupo de archivos. Cuando encuentre un patrón que cumple con las pautas en más de un archivo, imprime el nombre del archivo, seguido de una coma y de la línea que concuerda con el patrón:

$ grep es *
actores:Charlton Heston
alaska:Alaska es el estado más extenso de los Estados Unidos.
wilde:libro. Los libros están bien o mal escritos.
$

Cómo buscar líneas sin una cadena de caracteres determinada

Para buscar todas las líneas que no contengan una determinada cadena de caracteres, use la opción -v para grep. El siguiente ejemplo explica cómo buscar todas las líneas de los archivos del directorio personal medici que no contengan la letra e:

$ ls
actores    alaska    interior    tutores    wilde
$ grep -v e *
actores:Lun Mar 14 10:00 PST 1936
wilde:Eso es todo.
$

Más acerca de grep

También puede usar el comando grep para buscar destinos definidos como patrón usando expresiones regulares. Las expresiones regulares están formadas por letras y números, así como por caracteres que tienen un significado especial para grep. Dichos caracteres especiales, llamados metacaracteres, también tienen un significado especial para el sistema y tienen que ir entre comillas o entre paréntesis precedidos por una barra inversa. Siempre que use una expresión regular de grep tras el indicador de comando, escríbala entre comillas, o precedida de metacaracteres de escape (como & ! . * $ ? y \) con una barra inversa (\).

$ grep '^b' list

busca cualquier línea del archivo list que empiece por "b."

$ grep 'b$' list

muestra cualquier línea en la que "b" sea su último carácter. Y el comando:

$ grep '^b$' list

muestra cualquier línea de list en la que "b" es el único carácter de la línea.

$ grep 'an.' list

busca cualquier cadena de tres caracteres que contenga "an" como sus dos primeros, incluyendo "antes" "planta", "finanzas" y "plan" (ya que los espacios también se tienen en cuenta).

$ grep 'qu*' list

funcionará según lo esperaba. Sin embargo, si quiere buscar todas las palabras que contengan la letra "n", deberá escribir:

$ grep 'nn*' list

Si quiere buscar todas las palabras que contengan el modelo "nn", deberá introducir:

$ grep 'nnn*' list

Puede intentar ver lo que ocurre al contrario.

$ grep .* list

Cómo buscar metacaracteres

Suponga que quiera buscar las líneas de un texto que tenga el símbolo ($). Si precede el signo de dólar de la expresión regular con una barra invertida (\), indicará a grep que ignore (escape) su significado especial. Esto es válido también para los demás metacaracteres (& ! . * ? y el propio \).

Por ejemplo, la expresión

$ grep ^\.

concuerda líneas que empiecen con un punto, y resulta especialmente útil cuando busque peticiones de formateo de nroff o troff (que empiecen con un punto).

La siguiente tabla, Tabla 4-1, proporciona una lista de los patrones de búsqueda de modelos que más frecuentemente puede usar con grep..

Tabla 4-1 Elementos del modelo de búsqueda de grep

Carácter 

Concuerda 

^

El comienzo de una línea de texto 

$

El final de una línea de texto 

.

Cualquier carácter único 

[...] 

Cualquier carácter único de la lista o rango entre paréntesis 

[^...] 

Cualquier carácter que no esté en la lista o el rango 

*

Cero o más apariciones del carácter precedente o de la expresión regular 

.* 

Cero o más apariciones de cualquier carácter único 

\

Ignora el significado especial del próximo carácter 

Observe que estos caracteres de búsqueda también se pueden usar en las búsquedas del editor de textos vi.

Comillas dobles o sencillas en líneas de comando

Como se explicó anteriormente, las comillas se utilizan para delimitar el texto que desee que sea interpretado como una palabra. Por ejemplo, para que grep busque todos los archivos que contengan la frase "a la carga, mis valientes", deberá introducir lo siguiente:

$ grep "a la carga, mis valientes" *

Las comillas simples (') también se pueden usar para agrupar frases con palabras múltiples formando unidades únicas, o para asegurarse de que determinados caracteres como por ejemplo $ sean interpretados literalmente (el metacarácter historia ! se interpreta siempre como tal, incluso si está entre comillas, salvo que lo haga preceder por una barra inversa). En cualquier caso, es una buena idea escribir caracteres como & ! $ ? . ; y \ precedidos de una barra inversa, si quiere que se interpreten como caracteres tipográficos normales.

Si escribe por ejemplo:

$ grep $ list

verá todas las líneas de list. Sin embargo, si introduce:

$ grep '\$' list

sólo verá las líneas que contengan el caracter "$"..

Si desea más información acerca del comando grep(1), consulte man Pages(1): User Commands.