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 fiesta de la matriz. Para lograr que he intentado lo siguiente:

n=$(grep -i ipaddress /opt/ipfile |  cut -d'=' -f2 | tr ';' ' ')

Esto se traduce en la extracción de los valores de bien, pero por alguna razón el tamaño de la matriz se devuelve como 1 y me doy cuenta de que tanto los valores son identificados como el primer elemento de la matriz. Que es

echo ${n[0]}

devuelve

10.78.90.137 10.78.90.149

¿Cómo puedo solucionar este problema?

Gracias por la ayuda!

InformationsquelleAutor calvinkrishy | 2009-11-18

5 Comentarios

  1. 20

    ¿realmente necesitas una matriz

    bash

    $ 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 [email protected] #this is "array"

    si quieres poner en una matriz

    $ a=( [email protected] )
    $ echo ${a[0]}
    10.78.90.137
    $ echo ${a[1]}
    10.78.90.149

    @OP, en cuanto a su método: conjunto de su IFS a 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

    También, no es necesario utilizar 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

    gawk

    $ 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
    • Los valores son utilizados más tarde en la secuencia de comandos. Si se almacenan en una matriz sería más fácil para recorrer y realizar otras operaciones sobre ellos, de ahí la necesidad de almacenarlos en una matriz. El método que se describe debe ayudarme. Gracias! Podría usted por favor comparta sus pensamientos sobre por qué el método que estoy usando está fallando?
    • véase mi edición. una forma es el conjunto de IFS.
    • Gracias. Aprendido un par de trucos nuevos de hoy!
  2. 8

    Éste funciona:

    n=(`grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' '`)

    EDICIÓN: (mejorado, encajable versión como por Dennis)

    n=($(grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' '))
    • Si usted cambia su comillas simples inclinadas a $() voy a upvote usted.
    • Esto no funciona. Por CIERTO, no es la expresión de la misma como la que estoy usando? Hay alguna diferencia entre usar $() y ` (comillas simples inclinadas)?
    • A mí me funciona. Esto es lo que se vería con $(): n=($(grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' ')) – el exterior paréntesis hacen en una matriz. Es mejor usar $() porque pueden estar anidadas y es más fácil conseguir cotización y escapar a la derecha y son más legibles: mywiki.wooledge.org/BashFAQ/082
    • Gracias Dennis, el no backtick versión es definitivamente mejor.
  3. 1

    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 otro contenido, puede que no necesite el grep y se podía leer en el archivo entero.

    $ saveIFS="$IFS"
    $ IFS="=;"
    $ n=$(</opt/ipfile)
    $ IFS="$saveIFS"
  4. 1

    Un Perl solución:

    n=($(perl -ne 's/ipAddress=(.*);/$1 /&& print' filename))

    que las pruebas y elimina los caracteres no deseados en una sola operación.

  5. 0

    Usted puede hacer esto mediante el uso de IFS en bash.

    • Primera lectura de la primera línea del archivo.
    • Seoncd convertir en una matriz con = como delimitador.
    • Tercer convertir el valor a una matriz con ; como delimitador.

    Eso es todo !!!

    #!/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]}

Dejar respuesta

Please enter your comment!
Please enter your name here