Redirect output to a bash array

前端 未结 5 1212
感动是毒
感动是毒 2020-12-14 02:39

I have a file containing the string

ipAddress=10.78.90.137;10.78.90.149

I\'d like to place these two IP addresses in a bash array. To achie

相关标签:
5条回答
  • 2020-12-14 03:13

    do you really need an array

    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 $@ #this is "array"
    

    if you want to put into array

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

    @OP, regarding your method: set your IFS to a space

    $ 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
    

    Also, there is no need to use so many tools. you can just use awk, or simply the bash shell

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

    output

    $ 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
    
    0 讨论(0)
  • 2020-12-14 03:16

    A Perl solution:

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

    which tests for and removes the unwanted characters in one operation.

    0 讨论(0)
  • 2020-12-14 03:27

    A variation on a theme:

    $ 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
    

    If the file has no other contents, you may not need the grep and you could read in the whole file.

    $ saveIFS="$IFS"
    $ IFS="=;"
    $ n=$(</opt/ipfile)
    $ IFS="$saveIFS"
    
    0 讨论(0)
  • 2020-12-14 03:29

    You can do this by using IFS in bash.

    • First read the first line from file.
    • Seoncd convert that to an array with = as delimeter.
    • Third convert the value to an array with ; as delimeter.

    Thats it !!!

    #!/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]}
    
    0 讨论(0)
  • 2020-12-14 03:32

    This one works:

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

    EDIT: (improved, nestable version as per Dennis)

    n=($(grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' '))
    
    0 讨论(0)
提交回复
热议问题