¿Qué es GREP en Linux y cómo se usa?

Grep es un pequeño programa de UNIX para encontrar patrones coincidentes. Lanzado por primera vez en V6 UNIX, ahora puedes encontrarlo en casi cualquier sistema similar a UNIX, como Linux, macOS e incluso BSD. En este artículo, repasaré los conceptos básicos de Grep y te mostraré algunos ejemplos de cómo utilizar el programa para tareas diarias.
Lo Básico de Usar Grep
En su esencia, Grep es un programa simple y directo. Toma una entrada, encuentra el texto que deseas en esa entrada y imprime las coincidencias como salida. Grep puede procesar prácticamente cualquier fuente de texto plano. Esto le permite leer la entrada proveniente de otros comandos y buscar directamente en archivos.
La forma más sencilla de comenzar con Grep es leyendo datos de un archivo de texto. Por ejemplo, el siguiente comando imprime el contenido de mi archivo sample.txt:
grep'' sample.txtAdemás, puedes utilizar esta función para buscar y encontrar piezas específicas de texto dentro de tus archivos de texto:
grep'palabra' sample.txt
También puedes usar Grep con tuberías de UNIX, lo que te permite unir múltiples programas en un solo comando:
cat sample.txt |grep''
Bueno saber: Si deseas ampliar tu conocimiento sobre UNIX, aprende cómo funcionan los paginadores de pantalla en Linux consultando nuestra hoja de trucos para GNU less.
Encontrar Archivos en un Directorio
Una de las tareas más sencillas que puedes realizar con Grep es encontrar archivos en una lista de directorios. Para hacer esto, puedes enviar la salida del comando ls a través de una tubería de UNIX directamente a Grep.
El siguiente comando imprimirá y resaltará todos los archivos en tu carpeta de Descargas con la extensión de archivo .jpg:
ls ~/Downloads |grep \\.jpg
También puedes enviar una salida de ls más elaborada a Grep y usarla para coincidencias de patrones. Por ejemplo, el siguiente comando lista todos los archivos en el directorio con menos de 1MB de tamaño de archivo:
ls-lh ./|grep .KIgnorar la Mayúscula
Por defecto, casi todos los programas en un sistema similar a UNIX son sensibles a las mayúsculas. Esto significa que el sistema trata la cadena “Hola” de manera diferente a “hola”, “hOla” y “holA”.

Este comportamiento puede ser un inconveniente al buscar cadenas dentro de archivos. Por ejemplo, un ensayo puede tener tanto “Hola” como “hola” al mismo tiempo. Para abordar esto, ejecuta Grep con la bandera -i seguida de la cadena que deseas encontrar.
grep-i Hola hello.txt
Búsquedas Recursivas
Grep puede buscar en más de un archivo o directorio al mismo tiempo. Esto es útil si estás trabajando en un proyecto con múltiples archivos y quieres saber dónde aparece una cadena de texto en un directorio. Por ejemplo, el siguiente comando coincide con la palabra “MakeTechEasier” dentro del directorio “sample”:
grep-r'MakeTechEasier' ./sampleDicho esto, usar la bandera -r también hará que Grep busque en cada archivo de tu directorio objetivo. Esto puede ser un problema si también tienes archivos no de texto dentro de la carpeta que estás buscando. Para evitar eso, ejecuta Grep con la bandera -I:
grep-rI'MakeTechEasier' ./samplePor cierto: Aprende cómo puedes crear archivos en la terminal usando el comando touch.
Coincidir Archivos que Contienen la Cadena
Además de mostrar dónde ocurre una cadena específica en diferentes archivos, también puedes usar Grep para crear una lista de archivos que contienen tu texto objetivo. Esto es útil si deseas saber si un archivo contiene una cadena particular, pero no quieres que Grep imprima cada instancia de ella en la terminal.
Para hacer esto, ejecuta Grep con las banderas -r y -l seguidas de la cadena que deseas coincidir y el directorio que deseas consultar:
grep-rl MakeTechEasier ./sampleIncluso puedes encerrar tu comando Grep dentro de un subshell de Bash para crear múltiples condiciones para tu coincidencia de texto. Por ejemplo, la siguiente línea de código solo devolverá aquellos archivos que contengan tanto “Hola” como “MakeTechEasier” en la carpeta “sample”:
grep-rl MakeTechEasier $(grep-rl Hola ./sample)Encontrar lo Opuesto
Además de realizar búsquedas directas, Grep también puede devolver resultados que no coincidan con tus criterios iniciales. Aunque puede parecer contraintuitivo al principio, esto puede ser útil en casos donde necesitas resaltar errores y anomalías de tu entrada de texto.
Para hacer esto, ejecuta Grep con -v junto con otras banderas que deseas habilitar. Por ejemplo, el siguiente comando buscará recursivamente en cada archivo de mi carpeta “/etc/nginx” y devolverá todas las líneas que no contengan la cadena “nginx”:
grep-rv'nginx'/etc/nginx
Palabras y Líneas
También puede ser útil indicarle a Grep que busque palabras o líneas completas, en lugar de cualquier cosa que contenga un cierto patrón. Esto es útil si estás coincidiendo con una cadena de caracteres que es común en muchas palabras. Por ejemplo, coincidir con la palabra “it” devolverá muchos falsos positivos ya que “it” es una cadena común que puedes encontrar en palabras.
Para solucionar esto, puedes ejecutar Grep con la bandera -w seguida de la palabra que deseas coincidir:
cat it.txt |grep-w it
En lugar de imprimir todas las palabras que contienen el patrón, Grep solo imprimirá la palabra por sí misma. Hace lo mismo para líneas enteras con la bandera -x, por lo que si estás buscando una frase o una línea única en un archivo de configuración, eso puede ser de gran ayuda.
Agregar Números de Línea a la Salida de Grep
Los números de línea son una parte importante del depurador de programas y la corrección de textos. Te permiten referenciar con precisión la ubicación de una función o frase específica, lo que hace que sea mucho más rápido arreglar y modificar.
En este sentido, Grep viene con la capacidad de imprimir números de línea en su salida predeterminada. Para hacer esto, ejecuta el programa con la bandera -n seguida de la cadena que deseas coincidir:
grep-n main ./my-code.cCon la ayuda de las tuberías de UNIX, también puedes modificar la salida de Grep y solo imprimir los números de línea de lo que estás buscando. Esto hace que sea mucho más limpio y fácil de analizar textos grandes:
grep-n Sed essay.txt |cut-f1-d :FYI: Las tuberías de UNIX son más que solo una herramienta para Grep. Aprende cómo automatizar tus tareas de shell remoto creando y utilizando tuberías SSH.
Usando Expresiones Regulares Extendidas con Grep
Grep utiliza el conjunto de metacaracteres de Expresión Regular Básica (BRE) para coincidir y filtrar cadenas de texto. Si bien esto suele funcionar para la mayoría de las tareas, algunos usuarios pueden encontrarlo limitante, especialmente al trabajar con grupos de patrones.
Para abordar esto, la mayoría de las implementaciones de Grep proporcionan la bandera -E, que permite al programa analizar metacaracteres de Expresión Regular Extendida (ERE). Por ejemplo, el siguiente comando solo funcionará con la bandera -E:
printf"hola\nhellooooo\n"|grep-E .*o{2}$Nota: la versión GNU de Grep utiliza algunas funcionalidades de ERE por defecto. Sin embargo, es una buena práctica usar -E siempre que utilices ERE para preservar la compatibilidad con otros sistemas similares a UNIX.
Además, Grep también tiene un modo especial que elimina todas las funciones de Regex por completo. Para usar esto, ejecuta el programa con la bandera -F seguida de tu cadena simple:
grep-F[MakeTechEasier] ./fixed.txtAgregar Líneas Adyacentes a la Salida de Grep
Una de las principales fortalezas de Grep es mostrar dónde aparece el texto en tu archivo o flujo de entrada. Sin embargo, hay ocasiones en las que solo conocer la ubicación exacta de una cadena no ayuda al resolver problemas. Por ejemplo, un registro de fallos generalmente proporciona contexto adicional antes de imprimir el mensaje tradicional “Fallo de Segmentación”.
Una forma de resolver este problema es ejecutando Grep con la bandera -C seguida de la cantidad de líneas que deseas imprimir alrededor de tu texto objetivo. El siguiente comando imprime cinco líneas antes y después de tu coincidencia de texto:
grep-C5'Hola' ./hello-sample.txt
También puedes personalizar si Grep solo imprime el contexto previo o posterior con las banderas -B y -A. Por ejemplo, lo siguiente imprimirá las diez líneas anteriores a tu cadena objetivo:
grep-A10'Hola' ./hello-sample.txt
Con los conceptos básicos de Grep y cómo usarlo para tus tareas diarias bajo tu control, ahora puedes dar tu primer paso en la comprensión de la línea de comandos y las herramientas básicas de UNIX. Explora más de este mundo muy diverso y profundo aprendiendo cómo funciona sed en Linux.
Crédito de la imagen: Alejandro Escamilla a través de Unsplash. Todas las alteraciones y capturas de pantalla por Ramces Red.