LINUX – Comando GREP ejemplos varios.

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.- 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

42.- Buscar un patrón en múltiples archivos pero solo mostrar el nombre del archivo, una sola vez, aunque el patrón exista en varias líneas del archivo.

Para evitar que grep nos devuelva resultado por pantalla deberemos agregar la opción -q (quiet). Posteriormente podremos saber si la búsqueda generó algún resultado o no utilizando $?expresión que nos devuelve el resultado de la ejecución del último comando ingresado. Si $? es igual a 0, el último comando se ejecutó exitosamente; de otra manera, algo falló (o en este caso, no hubo resultados).

El siguiente script muestra en pantalla el nombre del archivo donde se encontró el patrón de búsqueda dentro de un directorio. Si no hubo coincidencias, también lo indicará. Tanto el patrón de búsqueda como el directorio son ingresados al script usogrep.sh como argumentos ($1 y $2 respectivamente).

Publicado en Unix - Linux | Deja un comentario

BASH – Script (LINUX) para extraer datos de un archivo JSON (XML) con comando GREP.

Para este ejemplo supondremos que tenemos el siguiente archivo en formato JSON (datos.json), y necesitamos extraer los NOMBRES. Esto es solo un ejemplo básico de como se pueden obtener los campos :

Publicado en Unix - Linux | Deja un comentario

BASH – Script agenda telefónica.

Este script básico, para manejar una agenda telefónica. Es un ejemplo que puede servir como base para realizar un SCRIPT más completo. Aquí solo guarda el nombre y número telefónico. Pero queda a la imaginación para darle un uso más profesional.

Publicado en Unix - Linux | Deja un comentario

Linux – Ver el tiempo que un proceso lleva en ejecuciónLinux.

En *nix, el comando ps permite listar y manejar procesos pero no se suele conocer la forma directa de visualizar el tiempo que lleva un proceso en ejecución. En realidad se puede sacar con la salida por defecto  a partir del valor de la columna STIME, que indica el momento en el que se inició (START TIME) pero hay que «calcular» el tiempo.

Para calcular el tiempo en ejecución de un proceso podemos utilizar el parámetro etime (elapsed time), el cual muestra en formato de fecha el tiempo que el proceso que le indiquemos lleva ejecutándose:

Lo combinaremos con otro parámetro (-p pidlist) en el que le diremos el PID a revisar y el formato (-o):

También podemos especificar el «output» que queramos para ps especificando los argumentos separados por comas después del «-o», un ejemplo:

Sabiendo esto podéis jugar creando alias de ps con la salida que necesitéis u crear las combinaciones que estiméis oportunas.

Publicado en Unix - Linux | Deja un comentario

BASH – Bucles for utilizando matrices asociativas.

En Bash 4 y versiones posteriores, las matrices asociativas le permiten crear listas de pares clave-valor que se pueden buscar por clave o por valor. Debido a la relación bidireccional entre la clave y el valor, también se denominan diccionarios de datos.

Podemos iterar a través de una matriz asociativa usando un  for círculo. Este script es «asociative.sh». Define una matriz asociativa con cuatro entradas, una para cada uno de «perro», «gato», «robin» y «humano». Estas son las claves. Los valores son el número (predeterminado) de patas que tiene cada uno.

El iterador se llama legs . Tenga en cuenta que el encabezado del ciclo contiene un «!«Punto de exclamación. Esto no actúa como el operador lógico NOT, es parte de la sintaxis de matriz asociativa. Se requiere para buscar a través de la matriz.

El cuerpo del bucle realiza una prueba de comparación de cadenas. Si el valor del miembro de la matriz es «de dos patas», imprime el valor de la clave en la ventana del terminal. Cuando lo ejecutamos, el script imprime las criaturas de dos patas.

Este codigo ${animals[@]} se expande a los valores y ${!animal[@]} se expande a dog cat robin human.

Publicado en Unix - Linux | Deja un comentario