informations dupliquées à récupérer et à affecter à une variable
j'ai encore une autre question concernant bash.
dans un fichier texte, il y a un ensemble d'informations. la constante ici est "sys app" et la fin "checker"
sys app /partition/app_webapps_80 {
load-balancing-mode least-connections-member
members {
/partition/host-1:80 {
address 10.20.20.200
}
/partition/host-2:80 {
address 10.20.20.201
}
}
checker /partition/tcp
}
sys app /partition/app_webapps_8989 {
members {
/partition/host-1:8989 {
address 10.20.20.200
}
/partition/host-2:8989 {
address 10.20.20.201
}
}
checker /partition/tcp
}
ce que j'ai fait est de créer une boucle while, puis j'utilise ce qui suit, mais j'obtiens l'adresse répliquée le nombre de lignes dans le fichier.
line=1
while read do rs=$(sed -n '/sys app/,/checker/p' filename |grep -m $line "address" |tail -n 1)
echo `$rs line=$[$line +1]`
done < filename
que dois-je faire, si je veux juste faire correspondre certaines informations entre 2 chaînes, puis les affecter à une variable que je peux utiliser pour plus tard?
apprécier tout conseil à ce sujet.
car sous app_webapps_80 et app_webapps_8989, ils ont la même adresse 10.20.20.200 et l'adresse 10.20.20.201
le résultat attendu est d'exécuter la boucle. et la boucle s'exécutera pour identifier le nombre d'adresses entre app_webapps_80 et le premier vérificateur
attribuez ensuite l'adresse 10.20.20.200 à une variable à utiliser, puis attribuez l'adresse 10.20.20.201 à une autre variable à utiliser
la boucle s'exécutera à nouveau pour identifier le nouveau app_webapps_8989 et le vérificateur de cette section répétera ce qu'il fait pour le premier ensemble.
Je ne sais pas si j'ai un sens à ce sujet?
Réponses
Au lieu de faire une correspondance de plage, je pense qu'il sera plus facile de la lire de haut en bas.
#!/bin/bash
declare -A A=()
while read -r b c; do
A[$b]=$c
done < <(awk '
/^ *sys app /{b=substr($3,12)} /^ *address /{a[b]=sprintf("%s %s",a[b],$2)}
END {
for(c in a){print c a[c])}
}' file)
# Let's iterate the assosiative array.
for d in ${!A[@]}; do set -- ${A[$d]} echo 1st - $d: $1 echo 2nd - $d: $2 echo All - $d: $@ echo Last - $d: ${@:(-1)} echo Range - $d: ${@:1:2}
done