Rediriger la sortie vers un tableau bash

j'ai un fichier contenant la chaîne de caractères

ipAddress=10.78.90.137;10.78.90.149

j'aimerais placer ces deux adresses IP dans un tableau bash. Pour y parvenir, j'ai essayé ce qui suit:

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

il en résulte l'extraction des valeurs alright mais pour une raison quelconque la taille du tableau est retournée comme 1 et je remarque que les deux valeurs sont identifiées comme le premier élément dans le tableau.

echo ${n[0]}

retourne

10.78.90.137 10.78.90.149

Comment puis-je corriger cette?

Merci pour votre aide!

17
demandé sur calvinkrishy 2009-11-18 05:58:43

5 réponses

avez-vous vraiment besoin d'un tableau

bash

$ ipAddress="10.78.90.137;10.78.90.149"
$ IFS=";"
$ set -- $ipAddress
$ echo 
10.78.90.137
$ echo 
10.78.90.149
$ unset IFS
$ echo $@ #this is "array"

si vous voulez mettre en tableau

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

@OP, en ce qui concerne votre méthode: réglez vos SI sur un espace

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

sortie

$ 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(/\"/,"",);gsub(/;/," ",) ;printf " "}' file) )
$ echo ${n[@]}
10.78.91.138 10.78.90.150 10.77.1.101 10.78.90.137 10.78.90.149
18
répondu ghostdog74 2009-11-18 06:10:44

celui-ci fonctionne:

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

EDIT: (improved, ntable version as per Dennis)

n=($(grep -i ipaddress filename | cut -d"=" -f2 | tr ';' ' '))
7
répondu Joy Dutta 2009-11-18 06:32:56

une variation sur Un thème:

$ 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 le fichier n'a pas d'autre contenu, Vous n'aurez peut-être pas besoin du grep et vous pouvez lire dans le dossier entier.

$ saveIFS="$IFS"
$ IFS="=;"
$ n=$(</opt/ipfile)
$ IFS="$saveIFS"
1
répondu Dennis Williamson 2009-11-18 05:52:13

une solution Perl:

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

les tests et supprime les caractères indésirables en une seule opération.

1
répondu J. A. Faucett 2015-09-22 11:13:39

Vous pouvez le faire en utilisant IFSbash.

  • lisez d'Abord la première ligne du fichier.
  • seoncd convertissez cela en tableau avec = en tant que delimètre.
  • troisième convertissez la valeur en tableau avec ; en tant que delimètre.

c'est elle !!!

#!/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
répondu rashok 2018-01-26 09:56:14