El procesamiento en paralelo en Bash se refiere a la ejecución simultánea de múltiples tareas o comandos en un script de Bash. Esto permite aprovechar al máximo los recursos disponibles en un sistema y puede acelerar considerablemente la ejecución de un programa o script.
Hay varias formas de lograr el procesamiento en paralelo en Bash. Una de las formas más comunes es utilizando subprocesos en segundo plano (background processes) y el comando wait para esperar a que todos los subprocesos terminen antes de continuar con el script principal.
Aquí hay un ejemplo simple que muestra cómo ejecutar múltiples comandos en paralelo usando subprocesos en segundo plano,
[crayon-68674b86cbe66706521971/]
Es importante tener en cuenta que el número de subprocesos en paralelo que se pueden ejecutar al mismo tiempo puede estar limitado por el sistema operativo y los recursos disponibles en el sistema. Además, el procesamiento en paralelo puede introducir complejidad adicional debido a posibles problemas de concurrencia, como la competencia por recursos compartidos. Por lo tanto, es importante diseñar y probar cuidadosamente el uso de procesamiento en paralelo en un script de Bash.
Un ejemplo
Supongamos que tienes una lista de URLs de sitios web y deseas extraer el título de cada página para realizar un análisis posterior. En lugar de procesar cada URL secuencialmente, puedes aprovechar el procesamiento en paralelo para acelerar el proceso. Aquí hay un ejemplo de cómo podrías hacerlo,
Por si estás programando algun script en bash o necesitar imprimir algun texto en consola de manera especial y no recuerdas cual era la combinación, El siguiente script (color-bash.sh) te imprime una tabla de colores en bash:
[crayon-68674b86cc6c3157630362/]
Al ejecutar este código, obtendremos el siguiente resultado :
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.
Shell
1
2
3
4
5
6
CLASES DE CARACTERES EN GREP.
[:blank:]Coincide con caracteres en blanco,tales como un espaciooun tabulador.
[:digit:]Coincide con caracteres numéricos.Equivalea[0-9]
[:lower:]Coincide con caracteres alfabéticos en minúscula.Equivalea[a-z]
[:upper:]Coincide con caracteres alfabéticos en mayúsculas.Equivalea[A-Z]
[:punct:]Coincide con signos de puntuacióntales 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…
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:
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:
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.
Shell
1
grep-irl$PATRON$DIRECTORIO/*
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).
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
# Patrón de búsqueda
PATRON=$1
# Directorio en donde buscar
DIRECTORIO=$2
# Búsqueda
grep-irq$PATRON$DIRECTORIO/*
if[$?-eq0];then
LUGAR=$(grep-irl$PATRON$DIRECTORIO/*)
echo"El patrón $PATRON fue localizado en $LUGAR."
else
echo"No se encontró el patrón $PATRON en los archivos presentes dentro de $DIRECTORIO."
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 :
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
{
"nombre":" Pedro Fernandez",
"edad":30,
"ciudad":"Santiago",
"profesion":"Ingeniero",
"hobbies":["natació "lectura", "senderismo"]
}
{
"nombre":"Gonzalo reiser Ampuero",
"edad":30,
"ciudad":"Santiago",
"profesion":"Ingeniero",
"hobbies":["natació "lectura", "senderismo"]
}
{
"nombre":"Juan Silva",
"edad":30,
"ciudad":"Santiago",
"profesion":"Ingeniero",
"hobbies":["natació "lectura", "senderismo"]
}
{
"nombre":"Hans petrovic",
"edad":30,
"ciudad":"Santiago",
"profesion":"Ingeniero",
"hobbies":["natació "lectura", "senderismo"]
}
{
"nombre":"Sebastian Ramirez Fuentes",
"edad":30,
"ciudad":"Santiago",
"profesion":"Ingeniero",
"hobbies":["natació "lectura", "senderismo"]
}
1
Con el siguiente SCRIPTS podemos obtener estos datos:
Shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# Nombre del archivo JSON
archivo_json="datos.json"
# Campo que queremos extraer
campo="nombre"
# Utilizar grep para buscar el campo en el archivo JSON
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.