Uso de Grep con varias cadenas

Niraj Menon 22 marzo 2022
Uso de Grep con varias cadenas

Como guionista de Bash, es posible que se encuentre en una situación en la que necesite analizar un muro de texto para obtener información relevante. A veces, esa información no está ordenada, lo que requiere que descubras un patrón para capturar todos los datos relevantes.

La mejor herramienta para este trabajo en Linux es grep, escrito por Ken Thompson alrededor de 1973. grep está disponible en todos los sistemas UNIX modernos.

Este tutorial cubrirá ampliamente el uso de grep, desde ejemplos básicos como capturar una sola frase hasta capturar múltiples patrones usando RegEx o cadenas fijas, asumiendo una línea de comando Bash.

Usando grep para capturar frases simples

La forma más sencilla de usar grep es encontrar las ocurrencias de una frase en un archivo. Dada una palabra objetivo y un archivo, podemos buscar la palabra en el archivo como se muestra.

user@linux:~$ cat file.txt
UNIX
tutorial
word
words
sword
tests
Linux

user@linux:~$ grep word file.txt
word
words
sword

Como puede ver arriba, se capturan todas las palabras que contienen la subcadena palabra.

También puede capturar la salida de un programa y grep la salida de una frase, como se muestra. Continuaremos usando el archivo como ejemplo, pero puede hacerlo con cualquier programa que imprima en stdout.

user@linux:~$ cat file.txt | grep word
word
words
sword

Si prefiere que grep solo imprima las frases que coinciden exactamente (es decir, que tengan espacios alrededor y no sean subcadenas de otras palabras), puede usar el indicador -w/--word-regexp para habilitar coincidencia de palabras

Puede usar la misma idea para unir frases si aparecen como una sola línea, con -x/--line-regexp.

user@linux:~$ cat file.txt | grep -w word
word

grep con cadenas múltiples

Para usar varias frases, separadas por saltos de línea, para capturar coincidencias relevantes en un archivo o secuencia de texto de un programa, puede usar -F/--fixed-strings para especificarlas.

En su lugar, puede pasar una cadena que se muestra a continuación para una pequeña cantidad de coincidencias, con un signo de dólar que indica una nueva línea.

grep -F "words$word" file.txt
# or
fgrep "words$word" file.txt

Para obtener una lista más grande de un archivo, puede usar cat para imprimir el archivo como argumento para grep y reutilizar la misma sintaxis.

user@linux:~$ cat match.txt
word
sword
user@linux:~$ fgrep "$(cat match.txt)" file.txt
word
words
sword

grep con RegEx

Esta sección será extremadamente útil si está familiarizado con RegEx. Con -E/--extended-regexp, puede especificar un patrón RegEx para capturar frases más complicadas que no se pueden captar con una sola frase o con varias.

Dado un archivo que contiene direcciones de correo electrónico y URL al azar, es posible que deseemos filtrar las líneas que coinciden con los correos electrónicos o URL, con invocaciones separadas del comando grep.

Un patrón RegEx simple, en su mayoría ingenuo, para capturar correos electrónicos sería [^\@]+\@[^\.]+.*. Para usar esto con grep, puedes hacer lo siguiente:

user@linux:~$ cat file.txt 
user@linux.com
linux@torvalds.com
not a URL or email
https://www.google.com/
https://apple.com/
not an email or URL
user@linux:~$ egrep '[^\@]+\@[^\.]+.*' file.txt
user@linux.com
linux@torvalds.com

Otro ejemplo que utiliza RegEx es especificar múltiples patrones para ver si cada uno de ellos existe en un archivo. Para ello, tenemos el siguiente patrón.

Tenga en cuenta la comparación entre los dos patrones RegEx utilizados en el ejemplo a continuación: uno usa el operador OR y el otro está escrito de manera que la línea debe contener las tres palabras.

user@linux:~$ cat file.txt
apple banana grape
bus lamppost bench
apple bench grape
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P 'apple|banana|grape' file.txt
apple banana grape
apple bench grape
banana grape apple
bus grape lamppost
yellow apple bus
user@linux:~$ grep -P '^(?=.*apple)(?=.*banana)(?=.*grape)' file.txt
apple banana grape
banana grape apple

Recuerde que grep no es la única herramienta de coincidencia de cadenas disponible para usted en los sistemas UNIX. También puede utilizar awk para capturar patrones complicados. También puede usar sed para reemplazar frases basadas en criterios coincidentes.

Este tutorial obtuvo información de la página del manual grep, a la que puede acceder escribiendo man grep en cualquier terminal UNIX o en esta página.