Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/11/2016, à 00:53

NoviceScript

Script Bash - Comparaison fichier texte

Bonjour,
Je me permets de vous sollicité car je débute dans le développement de script et étant étudiant en stage j'aurais besoin d'un coup de main.
Je souhaiterais écrire un script qui me permets de comparer deux fichier texte et d'identifier les différences.

Ces fichiers sont de la forme suivante :

ltm node /AA_BB_CC_IN {
    address X.X.X.X
    description AA_BB_CC_IN
    monitor /YY/XX_icmp_ZZ 
}
ltm node /DD_EE_FF_IN {
    address Y.Y.Y.Y
    description DD_EE_FF_IN
    monitor /YY/ZZ_icmp_UU 
}
...
etc

Je me suis tourné faire l'écriture d'un script bash étant le plus parlant pour moi. Pour cela j'ai souhaité utilisé la commande diff mais cela ne fonctionnait pas très bien étant donné que mes fichiers sont en format de bloc.

J'ai donc cherché a concaténer chaque paragraphes compris entre "ltm node" et "}" en une unique ligne ligne pour en suite faire une comparaison des deux fichiers lignes par lignes.

J'ai donc cherché et trouvé une commande permettant de concaténé un paragraphe en ligne :

sed -n '/ltm node/,/}/p' | tr '\n' ' '

Le problème est que je ne sais pas comment appliqué a l'aide d'une boucle la concaténation de l'ensemble des paragraphes de mon fichier texte.

Cordialement,


Modération : merci à l'avenir d'utiliser les balises code (explications ici).

Dernière modification par cqfd93 (Le 03/11/2016, à 08:12)

Hors ligne

#2 Le 03/11/2016, à 07:10

pingouinux

Re : Script Bash - Comparaison fichier texte

Bonjour,
Essaye cette commande

sed -n ':a;/}/{s/\n/ /gp;b};{N;ba}' fichier

qui donne ceci sur ton exemple

ltm node /AA_BB_CC_IN {     address X.X.X.X     description AA_BB_CC_IN     monitor /YY/XX_icmp_ZZ }
ltm node /DD_EE_FF_IN {     address Y.Y.Y.Y     description DD_EE_FF_IN     monitor /YY/ZZ_icmp_UU }

Hors ligne

#3 Le 05/11/2016, à 17:58

NoviceScript

Re : Script Bash - Comparaison fichier texte

Bonjour,

Merci de ton retour rapide, effectivement la commande fonctionne parfaitement pour le bout de texte que j'ai indiqué. Cependant mon fichier de configuration est plus long que celui indiqué et pose a priori problème pour certain cas. En effet a certain moment le contenu du fichier comprend plusieurs accolades consécutifs tel que :

ltm pool /Common/pool_DDD {
    members {
        /Common/SL_DDD_01_UUU:0 {
            address X.X.X.X
        }
        /Common/SL_BBB_02_CCC:0 {
            address Y.Y.Y.Y
        }
        /Common/SL_AAA_12_BBB:0 {
            address Z.Z.Z.Z
        }
    }
    monitor /SSS_SLTM 
    service-down-action reset
    slow-ramp-time 60
}

J'ai voulu adapter la commande mais je n'arrive pas a comprendre les modifications apportées..

Hors ligne

#4 Le 05/11/2016, à 18:50

pingouinux

Re : Script Bash - Comparaison fichier texte

Je ne sais pas si c'est ce que tu veux, mais la commande commence à devenir compliquée, et il faudrait envisager d'utiliser awk

sed -n 'h;:a;/^}/{x;s/\n/ /gp;d;b};{n;H;ba}' fichier

Hors ligne

#5 Le 05/11/2016, à 20:50

grigouille

Re : Script Bash - Comparaison fichier texte

Suggestion : crée un programme dans un autre langage qui reformate le fichier et appelle ce programme dans ton script bash.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#6 Le 07/11/2016, à 00:36

NoviceScript

Re : Script Bash - Comparaison fichier texte

Effectivement la commande awk était une solution possible lors de mes recherches mes je ne sais pas du tout comment faire avec c'est pour ça que j'étais partie dans un premier temps sur la commande sed pour uniformiser mes deux fichiers de configuration en un minimum de ligne pour ensuite leurs appliqué un diff et identifier les lignes supplémentaires.
Je vais dans ce cas essayer avec cette commande...

Hors ligne

#7 Le 13/11/2016, à 11:53

NoviceScript

Re : Script Bash - Comparaison fichier texte

Bonjour a tous je reviens vers vous pour la suite de mon problème,

J'ai pu trouvé un autre moyen de traité mon problème en récupérant les fichiers de configuration se trouvant directement en ligne unique et non en bloc tel que :

ltm node FE_LTM_01_SL_SBT1_IN { address X.X.X.X app-service none connection-limit 0 description FE_LTM_01_SL_SBT1_IN
ltm node FE_LTM_01_SL_WAP_IN { address Y.Y.Y.Y app-service none connection-limit 0 description FE_LTM_01_SL_WAP_IN
ltm node FE_LTM_01_SL_WEB_IN { address Z.Z.Z.Z app-service none connection-limit 0 description FE_LTM_01_SL_WEB_IN

Je souhaiterais donc comparer deux fichiers texte de ce format pour identifier les "node" manquant dans l'un des fichiers en appliquant cette algo

Parcourir le fichier 1 [boucle while avec read line]
Pour chaque ligne du fichier1 extraire le nom du nœud [cut -d " " -f3]
Pour chaque lignes du fichier2 chercher le nœud des n lignes du fichier1
        Si nœud présent dans fichier1 et fichier2 passer a la ligne suivante du fichier1 [plus tard vérifier que les paramètres de chacun des nœuds sont identique]
        Sinon recopier la ligne manquante dans fichier nommé résultat.txt


Malheureusement j'ai énormément de mal a mettre en place la boucle permettant de vérifier la présence de chacun des nœuds des n lignes du fichier1 sur les nœud des n lignes du fichier2.

Cordialement,

Hors ligne

#8 Le 21/11/2016, à 08:23

pingouinux

Re : Script Bash - Comparaison fichier texte

Tu devrais montrer un exemple avec deux petits fichiers, ainsi que le résultat souhaité.

Hors ligne