Recordemos que expect es una librería que automatiza de forma interactiva los scripts, así que si no tienes instalado ésta utilidad, para poder utilizar éste script deberás tenerlo previamente.
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
36
37
38
39
40
41
42
43
#!/bin/bash
#Contiene nombre de la cuenta (login)
account=super01
#Contiene la password antigua
pass_old=old-pw
#Contiene la nueva password
pass_new=new_pw
#Contiene el comando que se ejecutará
command=passwd
#Corresponde al archivo que contiene la lista de los servidores a los que se les cambiará la password
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,
Extraer titulos de URL.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# Lista de URLs
urls=(
"https://www.ejemplo1.com"
"https://www.ejemplo2.com"
"https://www.ejemplo3.com"
# Añadir más URLs según sea necesario
)
# Función para extraer el título de una página web
El comando mapfile ofrece una solución poderosa pero simple, que le permite leer sin esfuerzo líneas desde una entrada estándar (o un descriptor de archivo específico) en una variable de matriz. mapfile está disponible en Bash versión 4.0 y posteriores. La estructura de mando es la siguiente:
mapfile [options] array_variable < input_file
En el siguiente ejemplo, veremos cómo procesar datos CSV. Supongamos que tenemos un archivo CSV con los siguientes datos.
1
2
Alice,25,alice@example.com
Bob,30,bob@example.com
Al proceesar el archivo CVS «data.cvs», necesitamos separar las filas y tambien las columnas. Esto para mostarr los campos por separado de cada linea
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
input_file="data.csv"
mapfile-tcsv_data<"$input_file"
forline in"${csv_data[@]}";do
mapfile-t-d‘,’fields_array<<<“$line”
name=”${fields_array[0]}”
age=”${fields_array[1]}”
email=”${fields_array[2]}”
echo"Name: $name, Age: $age, Email: $email"
done
Al ejecutarlo nos mostrara el siguiente resultado :
El ‘readarray’ es uno de los comandos más útiles en Bash. Este, lee líneas de un archivo o entrada estándar y las asigna a una matriz. Este comando solo está disponible en versiones de bash 4.0 o superior.
La sintaxis para usar ‘readarray’ es la siguiente:
Las opciones disponibles para el comando ‘readarray’ son:
‘-d DELIM’: establece el delimitador que se utilizará al dividir líneas en elementos de matriz y, de forma predeterminada, el delimitador es un carácter de nueva línea.
‘-n COUNT’: especifica el número máximo de líneas para leer en la matriz.
‘-O ORIGIN’: establece el índice inicial de la matriz.
‘-s COUNT’: especifica el número de líneas que se saltan antes de leer en la matriz.
‘-t’: elimina el carácter de nueva línea final de cada línea leída en la matriz.
Suponga que tiene una matriz que contiene una combinación de caracteres alfabéticos y numéricos. Para realizar la clasificación en esta matriz, debe comparar el valor ASCII del carácter.
El código para nuestro ejemplo será como el siguiente.
Después de ejecutar el script, obtendrá un resultado como el que se muestra a continuación.
1
The sorted list is:567abcn
Otro ejemplo del uso de ‘readarray’ para leer líneas de un archivo en una matriz 2D y para eso he creado un testfile.txt cuyo contenido es:
1 2 3
4 5 6
7 8 9
Script bash, que demuestra el uso del comando ‘readarray’:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# Read lines from a file into the array
readarray-tlines<testfile.txt
# Declare a 2D array with 3 rows and 3 columns
declare-Aarray
# Iterate over the lines and split each line into elements
foriin"${!lines[@]}";do
IFS=' 'read-r-aelements<<<"${lines[i]}"
forjin"${!elements[@]}";do
if[[-n"${elements[j]}"]];then
array[$i,$j]=${elements[j]}
fi
done
done
# Print the array
for((i=0;i<3;i++));do
for((j=0;j<3;j++));do
echo-n"${array[$i,$j]} "
done
echo
done
Primero se declara una matriz 2D llamada ‘matriz’ y luego uso el comando ‘readarray’ para leer líneas de un archivo llamado ‘testfile.txt’ en la matriz ‘líneas’. A continuación, el código itera sobre la matriz de «líneas» y divide cada línea en elementos usando los comandos «IFS» y «leer».
Después de eso, almacena los elementos en la matriz 2D ‘matriz’ y luego usa el comando de lectura para dividir cada línea en elementos. Ahora cada elemento se asigna al elemento correspondiente en la matriz ‘matriz’ y, finalmente, se imprimen los contenidos de la matriz ‘matriz’ utilizando bucles for anidados.
1
2
3
4
bash bashfile.sh
123
456
789
Conclusión
El comando ‘readarray’ facilita la manipulación de grandes cantidades de datos en scripts de Bash. Siguiendo los ejemplos proporcionados en este artículo, puede comenzar a usar ‘readarray’ en sus propios scripts de Bash para leer líneas de archivos y procesarlos en matrices 2D.
¿Te ha servido este sitio alguna vez? Cada script, cada línea de ayuda aquí es fruto de horas de trabajo y pasión por compartir. Si alguna vez resolviste un problema gracias a esta página, considera hacer una donación. Tu aporte —por pequeño que sea— mantiene vivo este proyecto y me impulsa a seguir creando.