Grep (por sus siglas en inglés Globally Search For Regular Expression and Print out) es una herramienta de líneas de comando usada para buscar cadenas de texto y encontrar coincidencias dentro de este. También puede ser utilizada para encontrar una palabra o combinación de palabras dentro de un fichero.
Esta herramienta requiere de dos parámetros básicos como el patrón a buscar y el archivo en el que se realizará la búsqueda. Además, es importante que conozcamos las expresiones regulares, debido a que estos patrones nos permitirán introducir combinaciones y caracteres para mejorar las búsquedas que hagamos. Una expresión regular usualmente es tomada por el comando de una línea de comandos, lee la lista de archivos e imprime las líneas que contienen coincidencias con la expresión regular.
1 2 3 4 5 6 |
CLASES DE CARACTERES EN GREP. [:blank:] Coincide con caracteres en blanco, tales como un espacio o un tabulador. [:digit:] Coincide con caracteres numéricos. Equivale a [0-9] [:lower:] Coincide con caracteres alfabéticos en minúscula. Equivale a [a-z] [:upper:] Coincide con caracteres alfabéticos en mayúsculas. Equivale a [A-Z] [:punct:] Coincide con signos de puntuación tales como !, #, $ y @ |
1.- Podemos filtrar únicamente aquellas líneas que contengan números con el siguiente comando:
grep [[:digit:]] /tmp/archivo.txt
2.- Otra funcionalidad interesante es la de buscar varios patrones en uno o varios archivos. Supongamos que tenemos un archivo de texto denominado /tmp/usuarios.txt, que contiene lo siguiente:
Power
Docker
Y quisiéramos buscar dentro del archivo /etc/group aquellas líneas que
contengan las palabras «power» o «docker». Podríamos hacer lo siguiente:
grep -f /tmp/usuarios.txt /etc/group
3.- Este comando filtra, del archivo /etc/passwd, aquellas líneas que incluyan la palabra «root» o «dbus» al principio de la línea.
grep -E «^root|^dbus» /etc/passwd
4.- Buscar los número con 1 o 2 dígitos…
grep -E «^[0-9][0-9]?$» numeros.txt
Si cambiamos por un * aparecerá 0 veces o más veces por lo tanto mostrara todos los números.
$ grep -E «^[0-9][0-9]*$» numeros.txt
Podemos decir que los primeros números sean del 0 al 9 y los segundos del 0 al 5 por ejemplo. Eso excluirá los 2°, 3° y 4° dígito superior a 5 …
$ grep -E «^[0-9][0-5]*$» numeros.txt
Determinar el número exacto de veces que deseamos que se repita el rango.
$ grep -E «^[0-9]{3}$» numeros.txt
144
233
Especificamos un rango de veces. Por ejemplo los números que contengan 2 a 4 veces.
$ grep -E «^[0-9]{2,4}$» numeros.txt
55
89
144
987
1597
6765
Agrupar expresiones.
Si queremos los números de 1 dígito y los de 3 dígitos, podemos usar dos expresiones regulares dentro de grep con la opción -e por ejemplo…
$ grep -E -e «^[0-9][0-9][0-9]$» -e «^[0-9]$» numeros.txt
1
1
2
3
5
8
144
987
Pero podemos agrupar ésta opción …
$ grep -E «^[0-9]([0-9][0-9])?$» numeros.txt
1
5
8
377
5.- Buscar una fecha.
grep -E [0-9]{2}/[0-9]{2}/[0-9]{4} prueba.txt
6.- Buscra una hora :
grep -E [0-9]{2}:[0-9]{2}:[0-9]{2} prueba.txt
6.- En el siguiente ejemplo, buscamos todas las apariciones de las palabras fatal, error y critical en el archivo de registro :
grep ‘fatal\|error\|critical’ /var/log/nginx/error.log
7.- Modosilencioso en un if :
if grep -q PATTERN filename
then
echo pattern found
else
echo pattern not found
fi
8.- Sacar 2 lineas por encima y 2 lineas por debajo del output :
Cat /etc/passwd | grep -i “ROOT” -C 2
9.- Si al inicio de la salida del comando quieren añadir el nombre del fichero en que se halla la línea mostrada en pantalla deberán usar la opción -H del siguiente modo:
grep -H -F ‘the’ .bashrc
10.- Pero si queremos obtener únicamente aquellas líneas cuyo único contenido sea la palabra blanco añadiremos la opción -x del siguiente modo:
grep -w -x «blanco» /home/joan/opciones.txt
11.- Con él podemos buscar, por ejemplo, secuencias de varios números seguidos que empiecen con «:».
grep -E ‘:[0-9]+’ regex
12.- Primero vamos a buscar todas las secuencias de cuatro dígitos que haya:
grep ‘[0-9]\{4\}’ regex
13.- Ahora el otro ejemplo con las llaves. Supongamos que queremos encontrar palabras que tengan entre 3 y 6 letras minúsculas. Podríamos hacer lo siguiente:
grep ‘[a-z]\{3,6\}’ regex
14.- Extraer la lista de direcciones de correo electrónico de un archivo:
grep -Eio ‘[a-z0-9._-]+@[a-z0-9.-]+[a-z]{2,4}’ fichero.txt
15.- El siguiente comando extraerá todos los enlaces de un archivo
grep –Eoi ‘<a[^>]+>.*</a>’ filename
16.- Buscar en el archivo /etc/group todas las líneas que empiezan por m.
grep ‘^m’ /etc/group
Texto que acab en “a” :
grep -E ‘a$’ <<<«abracadabra»
17.- Todas las líneas que no contengan ninguno de los siguientes caracteres: sawgtfixkgts.
grep -v «[sawgtfixk]» /usr/share/hunspell/en_US.dic
18.- Todas las líneas que comiencen con 3 letras cualquieras y la palabra dig.
grep «^…dig» /usr/share/hunspell/en_US.dic
19.- Todas las líneas que terminen al menos en una e.
grep -E «e+$» /usr/share/hunspell/en_US.dic
20.- Todas las líneas que contengan una de las siguientes palabras: org, kay o tuna.
grep -E «org|kay|tuna» /usr/share/hunspell/en_US.dic
21.- Cantidad de líneas que comiencen con una o ninguna c seguida de la cadena ati.
grep -cE «^c?ati» /usr/share/hunspell/en_US.dic
22.- Vamos con cosas un poco más complicadas. El carácter «+» empareja con el carácter que aparece a su izquierda repetido al menos una vez. Este carácter sólo está disponible con las expresiones regulares extendidas. Con él podemos buscar, por ejemplo, secuencias de varios números seguidos que empiecen con «:».
grep -E ‘:[0-9]+’ regex
23.- Buscar todas las secuencias de cuatro dígitos que haya:
grep ‘[0-9]\{4\}’ regex (Expresión regular básica)
grep -E ‘[0-9]{4}’ regex (Expresión regular extendida)
24.- Supongamos que queremos encontrar palabras que tengan entre 3 y 6 letras minúsculas. Podríamos hacer lo siguiente:
grep ‘[a-z]\{3,6\}’ regex
No es lo que se desea, ya que la expresión regular encuentra las letras dentro de otras palabras que son más largas. Esto lo podría solucionar :
grep ‘\<[a-z]\{3,6\}\>’ regex
25.- imprimir todas las líneas que no empiezan por m.
grep -v ‘^m’ /etc/group
26.- Entre una «a» y la siguiente puede haber hasta dos caracteres:
grep -E ‘^(?a..?)+a?$’ <<<«abracadabra»
27.- El texto contiene al menos un carácter cualquier
grep -E ‘.’ <<<«abracadabra»
28.- El texto contiene un punto
grep -E ‘\.’ <<<«abracadabra»
29.- Comienza el texto por una letra mayúscula
grep -E ‘^[A-Z]’ <<<«Pepe Gotera y Otilio»
30.- Hay alguna palabra que empieze por «o»
grep -E ‘\b[[=o=]]’ <<<«Pepe Gotera y Otilio»
31.- El texto empieza y acaba con los mismos caracteres
grep -E ‘^(?.+).*\1$’ <<<«abracadabra»
32.- Seleccionar una frase si no contiene la palabra Pepe:
grep -P ‘^((?!Pepe).)*$’ <<<«abracadabra»
33.- Muestra todas las líneas que tengan un numero de telefono con extension (letra x o X seguido de 4 digitos) :
grep «[xX][[:digit:]]\{4\}» ejemplos/grepdata.txt
34.- Muestra todas las lineas que comiencen por 3 digitos y un espacio (utilizad \{\}).
grep «^[[:digit:]]\{3\} » ejemplos/grepdata.txt
35.- Muestra todas las lineas que contengan un año (suponed que es despues del 2000).
grep «2[[:digit:]]\{3\} » ejemplos/grepdata.txt
36.- Para generar todas las líneas en «/ usr / dict / words» que tengan exactamente tres caracteres de ancho, escriba:
grep ’ˆ…$’ /usr/dictar/palabras
37.- Para generar todas las líneas en «/ usr / dict / words» que tengan exactamente doce caracteres de ancho, escriba:
grep ’ˆ.\{22,\}$’ /usr/dictar/palabras
38.- Que las lineas comiencen por 2, 4 o 5 :
grep -P ‘^[245]\s+’ /tmp/grep_file
39.- Buscar palabras de 5 caracteres en que la tercera letra sea una “j” y la ultima una “r” :
grep -i ‘^..j.r$’ /usr/share/dict/words
40 .- Las líneas que comiencen por una letra MAYUSCULA :
grep -h ‘^[A-Z]’ dirlist*.txt
41 .- Las líneas que comiencen por una letra Mayúscula, Minúscula o Numero :
grep -h ‘^[A-Za-z0-9]’ dirlist*.txt