script - log_file bash
Redirigir la salida a una matriz bash (5)
Tengo un archivo que contiene la cadena
ipAddress=10.78.90.137;10.78.90.149
Me gustaría colocar estas dos direcciones IP en una matriz bash. Para lograrlo probé lo siguiente:
n=$(grep -i ipaddress /opt/ipfile | cut -d''='' -f2 | tr '';'' '' '')
Esto da como resultado la extracción de los valores, pero por alguna razón, el tamaño de la matriz se devuelve como 1 y me doy cuenta de que ambos valores se identifican como el primer elemento de la matriz. Es decir
echo ${n[0]}
devoluciones
10.78.90.137 10.78.90.149
¿Cómo puedo solucionar esto?
¡Gracias por la ayuda!
Éste funciona:
n=(`grep -i ipaddress filename | cut -d"=" -f2 | tr '';'' '' ''`)
EDITAR: (versión mejorada, encajable según Dennis)
n=($(grep -i ipaddress filename | cut -d"=" -f2 | tr '';'' '' ''))
¿realmente necesitas una matriz
golpetazo
$ ipAddress="10.78.90.137;10.78.90.149"
$ IFS=";"
$ set -- $ipAddress
$ echo $1
10.78.90.137
$ echo $2
10.78.90.149
$ unset IFS
$ echo $@ #this is "array"
si quieres poner en matriz
$ a=( $@ )
$ echo ${a[0]}
10.78.90.137
$ echo ${a[1]}
10.78.90.149
@OP, con respecto a su método: configure su IFS en un espacio
$ IFS=" "
$ n=( $(grep -i ipaddress file | cut -d''='' -f2 | tr '';'' '' '' | sed ''s/"//g'' ) )
$ echo ${n[1]}
10.78.90.149
$ echo ${n[0]}
10.78.90.137
$ unset IFS
Además, no hay necesidad de usar tantas herramientas. puedes usar awk, o simplemente el shell bash
#!/bin/bash
declare -a arr
while IFS="=" read -r caption addresses
do
case "$caption" in
ipAddress*)
addresses=${addresses//[/"]/}
arr=( ${arr[@]} ${addresses//;/ } )
esac
done < "file"
echo ${arr[@]}
salida
$ more file
foo
bar
ipAddress="10.78.91.138;10.78.90.150;10.77.1.101"
foo1
ipAddress="10.78.90.137;10.78.90.149"
bar1
$./shell.sh
10.78.91.138 10.78.90.150 10.77.1.101 10.78.90.137 10.78.90.149
papar moscas
$ n=( $(gawk -F"=" ''/ipAddress/{gsub(//"/,"",$2);gsub(/;/," ",$2) ;printf $2" "}'' file) )
$ echo ${n[@]}
10.78.91.138 10.78.90.150 10.77.1.101 10.78.90.137 10.78.90.149
Puedes hacer esto usando IFS
en bash
.
- Primero lea la primera línea del archivo.
- Se debe convertir eso a una matriz con
=
como delimitador. - Tercero convertir el valor a una matriz con
;
como delimitador.
Eso es !!!
#!/bin/bash
IFS=''/n'' read -r lstr < "a.txt"
IFS=''='' read -r -a lstr_arr <<< $lstr
IFS='';'' read -r -a ip_arr <<< ${lstr_arr[1]}
echo ${ip_arr[0]}
echo ${ip_arr[1]}
Una solución de Perl:
n=($(perl -ne ''s/ipAddress=(.*);/$1 / && print'' filename))
que prueba y elimina los caracteres no deseados en una operación.
Una variación sobre un tema:
$ line=$(grep -i ipaddress /opt/ipfile)
$ saveIFS="$IFS" # always save it and put it back to be safe
$ IFS="=;"
$ n=($line)
$ IFS="$saveIFS"
$ echo ${n[0]}
ipAddress
$ echo ${n[1]}
10.78.90.137
$ echo ${n[2]}
10.78.90.149
Si el archivo no tiene otros contenidos, es posible que no necesite el grep
y que pueda leer todo el archivo.
$ saveIFS="$IFS"
$ IFS="=;"
$ n=$(</opt/ipfile)
$ IFS="$saveIFS"