write script print log_file log for array bash shell redirect

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"