informations dupliquées à récupérer et à affecter à une variable

Oct 26 2020

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

1 bac0n Oct 27 2020 at 06:56

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