grep significa Globally Search For Regular Expression and Print out (Búsqueda global de expresiones regulares). Es una herramienta de línea de comando usada en sistemas Linux y Unix para buscar un patrón específico en un archivo o grupo de archivos.

grep tiene muchas opciones que permiten realizar varias acciones relacionadas con la búsqueda en archivos. En este artículo, observaremos como usar el comando grep con sus opciones disponibles tanto como expresiones regulares básicas para buscar archivos.

Cómo usar grep

Sin el paso de ninguna opción, grep puede ser usado para buscar un patrón en un archivo o grupo de archivos. La sintaxis es:

grep '<texto-buscado>' <archivo/archivos>

Tenga en cuenta que las comillas simples o dobles son requeridas alrededor del texto si es más de una palabra.

Tú puedes además usar el comodín (*) para seleccionar todos los archivos en un directorio.

El resultado de esto son las ocurrencias del patrón (por la línea en la que se encuentra) en los archivos. Si no existe una coincidencia, no se imprimirá ninguna salida en la terminal.

Por ejemplo, supongamos que tenemos los siguientes archivos (llamados grep.txt):

Hello, how are you
I am grep
Nice to meet you

El siguiente comando grep buscará todas las ocurrencias de la palabra "you":

grep you grep.txt

El resultado será:

Hello, how are you
Nice to meet you

you se espera que tenga un color diferente al del otro texto para identificar fácilmente lo que se buscó.

Pero grep viene con más opciones que nos ayudan a lograr más durante la operación de búsqueda. Veamos nueve de ellos mientras los aplicamos al ejemplo anterior.

Opciones usadas con grep

1. -n (--line-number) - enumera los números de línea

Imprime las coincidencias de un texto junto con los números de línea. Si observas el resultado anterior, notarás que no se encuentran los números de líneas, solo las coincidencias.

grep you grep.txt -n

Resultado:

1: Hello, how are you
3: Nice to meet you

2. -c (--count) - imprime el número de líneas de coincidencias

grep you grep.txt -c

Resultado:

2

Tenga en cuenta si existiera otro "you" en la línea uno, la opción -c  aún imprimiría 2. Esto porque está relacionada con el número de líneas donde aparecen las coincidencias, no la cantidad de coincidencias.

3. -v (--invert-match) - imprime las líneas que no coinciden con el patrón especificado

grep you grep.txt -v -n

Resultado:

2. I am grep

Notaste que nosotros usamos también la opción  -n? Si, es posible usar múltiples opciones en un solo comando.

4. -i (--ignore-case) - Utilizado para la distinción de mayúsculas y minúsculas

# comando 1
grep You grep.txt
# comando 2
grep YoU grep.txt -i

Resultado:

# resultado 1
# no hay resultados
# resultado 2
Hello, how are you
Nice to meet you

5. -l (--files-with-matches) - imprimir nombres de archivos que coincidan con un patrón

# comando 1
grep you grep.txt -l
# comando 2
grep You grep.txt -i -l

Resultado:

# resultado 1
grep.txt
# resultado 2
# todos los archivos en el directorio actual que coincidan
# el texto 'You' sea mayúscula o minúscula
#### 6. `-w` (--word-regexp) - imprime coincidencias de toda la palabra

Por defecto, grep coincide con cadenas que contienen el patrón especificado. Esto significa que grep yo grep.txt imprimirá los mismos resultados que  grep yo grep.txt porque 'yo' puede ser encontrado en 'you'. Similarmente 'ou'.

Con la opción -w, grep se asegura que las coincidencias sean exactamente el mismo patrón especificado, Ejemplo:

grep yo grep.txt -w

Resultado:

Sin resultados!

7. -o (--only-matching) - imprimir solo el patrón coincidente

Por defecto, grep imprime la línea donde se encuentra el patrón que coincide. Con la opción -o , solo los patrones que coincidan son impresos línea por línea. Ejemplo:

grep yo grep.txt -o

Resultado:

yo

8. -A (--after-context) y -B (--before-context) - imprimir las líneas después y antes (respectivamente) del patrón coincidente

grep grep grep.txt -A 1 -B 1

Resultado:

Hello, how are you
I am grep
Nice to meet you

Esta coincidencia de patrón se encuentra en la línea 2. -A 1 significa una línea después de la línea que coincide y -B 1 significa una línea antes de la línea que coincide.

Además existe -C (--context) opción el cual es igual a -A + -B.  El valor pasado a -C se usaría para -A y -B.

9. -R (--dereference-recursive) - búsqueda recursiva

Por defecto, grep no puede buscar directorios. Si tú intentas hacerlo, obtendrás un error ("Es un directorio"). Con la opción  -R, la búsqueda de archivos entre directorios y subdirectorios se vuelve posible. Ejemplo:

grep you .

Resultado:

# 'you' coincide en carpetas
# y archivos a partir del
# directorio actual

Expresiones regulares para patrones

grep también permite especificar patrones con expresiones regulares básicas. Dos de ellas son:

1. ^pattern - Inicio de línea

Este patrón significa que grep solo coincide con cadenas cuyas líneas empiecen con la cadena especificada después ^. Ejemplo:

grep ^I grep.txt -n

Resultado:

2: I

2. pattern$ - fin de la línea

En contraste con  ^, $ especifica patrones que coincidirán si la línea termina con la cadena antes $. Ejemplo:

grep you$ grep.txt

Resultado:

1: Hello, how are you
3: Nice to meet you

Resumen

grep es una herramienta poderosa para la búsqueda de archivos en la terminal.

Entender como usarlo te brinda la habilidad de encontrar fácilmente archivos por medio de la terminal.

Existen más opciones relacionadas con esta herramienta. Puedes encontrarlas con el comando man grep.

Traducido del artículo de  - Dillion Megida - Grep Command Tutorial – How to Search for a File in Linux and Unix with Recursive Find