#1 Le 02/04/2015, à 15:28
- Beuhlet_Reseau
Traitement fichier avec script
Bonjour,
Je souhaite opérer un traitement sur le fichier des routes statiques. Le principe est plutôt simple à expliquer mais compliqué à réaliser
Donc voila je voudrais partir du fichier de base des routes statiques puis
Voyons ci je me trompe :
J'initialise ces variables :
Masque_32="255.255.255.255"
Masque_25="255.255.255.128"
Masque_18="255.255.192.0"
cat /etc/sysconfig/network-scripts/route-bond0 | grep -v "#" > fic_temp
cat fic_temp | sed s'/\/[3][2]/$Masque_32/g' | sed s'/\/[2][5]/$Masque_25/g' | sed s'/\/[1][8]/$Masque_18/g' > routes_statique
En gros voilà mon fichier :
10.114.138.28 via 10.208.12.254 dev bond0
10.114.128.0/18 via 10.208.12.254 dev bond0
10.163.144.0/25 via 10.208.12.254 dev bond0
Est ce un rêve de chercher la perfection
Je sais pas trop comment faire mais j'aimerais que lorsqu’aucun masque n'est spécifié qu'il en applique un par défaut à savoir 255.255.255.255 (un host quoi) et si il en recontre un /xx qu'il applique le masque spécifié dans une des variables (sa fonctionne bien mais sa me sort sa :
10.114.138.28 via 10.208.12.254 dev bond0
10.114.128.0255.255.192.0 via 10.208.12.254 dev bond0
10.163.144.0255.255.255.128 via 10.208.12.254 dev bond0
Moi j'aimerais sa :
10.114.138.28 255.255.255.255 10.208.12.254
10.114.128.0 255.255.192.0 via 10.208.12.254
10.163.144.0 255.255.255.128 via 10.208.12.254
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#2 Le 03/04/2015, à 07:12
- pingouinux
Re : Traitement fichier avec script
Bonjour,
Peut-être ceci, si j'ai bien compris ?
sed "s#/32# $Masque_32#;ta;s#/25# $Masque_25#;ta;s#/18# $Masque_18#;ta;s# # $Masque_32 #;:a;s# via##;s# dev bond0##" fic_temp
Hors ligne
#3 Le 03/04/2015, à 09:56
- Beuhlet_Reseau
Re : Traitement fichier avec script
Bonjour,
Peut-être ceci, si j'ai bien compris ?sed "s#/32# $Masque_32#;ta;s#/25# $Masque_25#;ta;s#/18# $Masque_18#;ta;s# # $Masque_32 #;:a;s# via##;s# dev bond0##" fic_temp
Pingouinux tu viens de m'en boucher un coin ! J'étais en train de me dépatouiller avec des fichiers tmp à tire-larigot, des awk ect...
Je sais que tu vas me dire d'aller voir man sed mais là j'aimerais avoir tes explications sur la commandes car elle diffère beaucoup des miennes
sed s'/\// /g' | sed s'/via//g' | sed s'/dev//g' | sed s'/bond0//g'
Tu vois elle a l'ère simple rien qu'à la regarder
Mais toi tu utilises des doubles quotes, des diezs, des "ta" ^^ .. Sinon juste brièvement histoire que je légende ta commande pour savoir l'utiliser après
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#4 Le 03/04/2015, à 11:31
- pingouinux
Re : Traitement fichier avec script
sed "s#/32# $Masque_32#;ta;s#/25# $Masque_25#;ta;s#/18# $Masque_18#;ta;s# # $Masque_32 #;:a;s# via##;s# dev bond0##" fic_temp
Simples ou doubles quotes, peu importe, sauf s'il y en a dans la chaîne (ce n'est pas le cas ici), ou si la chaîne contient des variables d'environnement (comme $Masque_32, qui n'aurait pas la bonne valeur avec des simples quotes)
ta permet de se débrancher à l'étiquette :a si l'expression régulière qui précède a été trouvée
La syntaxe pour le remplacement de chaîne est sxchaine_1xchaine_2x, x étant un caractère quelconque. On utilise habituellement /. Certaines chaînes contenant un /, j'ai utilisé #, pour éviter le \, que je trouve moins lisible : s/\/32/ $Masque_32/
Édité : Correction orthographe
Dernière modification par pingouinux (Le 16/06/2015, à 18:09)
Hors ligne
#5 Le 16/06/2015, à 17:30
- Beuhlet_Reseau
Re : Traitement fichier avec script
sed "s#/32# $Masque_32#;ta;s#/25# $Masque_25#;ta;s#/18# $Masque_18#;ta;s# # $Masque_32 #;:a;s# via##;s# dev bond0##" fic_temp
Simples ou doubles quotes, peu importe, saut s'il y en a dans la chaîne (ce n'est pas le cas ici), ou si la chaîne contient des variables d'environnement (comme $Masque_32, qui n'aurait pas la bonne valeur avec des simples quotes)
ta permet de se débrancher à l'étiquette :a si l'expression régulière qui précède a été trouvée
La syntaxe pour le remplacement de chaîne est sxchaine_1xchaine_2x, x étant un caractère quelconque. On utilise habituellement /. Certaines chaînes contenant un /, j'ai utilisé #, pour éviter le \, que je trouve moins lisible : s/\/32/ $Masque_32/
Je me permets de revenir sur ce sujet datant quelque peu. Voilà le souci, la commande était parfaite et me permettait en une ligne de faire l'équivalent de 10 lignes (enfin pour moi).
Elle fonctionnait très bien mais depuis peu j'ai eu des remontées d'erreurs (orthographe 10/10) . Je me suis penché sur le problème et j'ai pu remarquer qu'un message d'erreur apparaissait à la dite ligne sur la console.
J'ai alors relancé manuellement la commande :
cat $tmp | sed "s#/32# $Masque_32#;ta;s#/24# $Masque_24#;ta;s#/25# $Masque_25#;ta;s#/18# $Masque_18#;ta;s# # $Masque_32 #;:a;s# via##;s# dev bond0##;s# dev bond1##"
sed: Label too long: s#/32# 255.255.255.255#;ta;s#/24# 255.255.255.0#;ta;s#/25# 255.255.255.128#;ta;s#/18# 255.255.192.0#;ta;s# # 255.255.255.255 #;:a;s# via##;s# dev bond0##;s# dev bond1##
Pour rappel, je déclare bel et bien ses variables au début du script à savoir :
Masque_32="255.255.255.255"
Masque_25="255.255.255.128"
Masque_18="255.255.192.0"
Masque_24="255.255.255.0"
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#6 Le 16/06/2015, à 18:15
- pingouinux
Re : Traitement fichier avec script
Bonjour,
Que vaut la variable tmp, et que contient le fichier $tmp.
Hors ligne
#7 Le 17/06/2015, à 10:17
- Beuhlet_Reseau
Re : Traitement fichier avec script
Bonjour,
Que vaut la variable tmp, et que contient le fichier $tmp.
C'est un fichier contenant la table de routage statique de la machine linux à savoir :
cat /etc/sysconfig/network-scripts/route-bond0 | grep -v "#" > $tmp
cat /etc/sysconfig/network-scripts/route-bond1 | grep -v "#" >> $tmp
112 Lignes dans le fichier
Dernière modification par Beuhlet_Reseau (Le 17/06/2015, à 10:39)
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#8 Le 17/06/2015, à 12:14
- pingouinux
Re : Traitement fichier avec script
Si tu ne montres pas ton fichier réel (ou du moins une partie) pour reproduire l'erreur, je ne peux rien pour toi.
Hors ligne
#9 Le 17/06/2015, à 16:55
- Beuhlet_Reseau
Re : Traitement fichier avec script
J'ai corriger l'erreur en enchaînant les pipes lors de la commande SED. Le fichier n'est pas très important car identique à celui lorsque le SED fonctionnait encore. Mais sinon voilà la forme du fichier :
10.163.220.6 via 10.162.175.126 dev bond0
10.163.220.40 via 10.162.175.126 dev bond0
10.157.0.11 via 10.162.175.126 dev bond0
10.157.0.12 via 10.162.175.126 dev bond0
10.162.77.86 via 10.162.175.126 dev bond0
Mais encore un autre problème avec le SED (ça commence à faire beaucoup pour cet outil), lorsque le fichier a été traité suivant le modèle :
10.163.220.6 10.162.175.126
10.163.220.40 10.162.175.126
10.157.0.11 10.162.175.126
10.157.0.12 10.162.175.126
10.162.77.86 10.162.175.126
Je compte le nombre de lignes du fichier (que j'appelerait Routesref) ci-dessus avec la commande wc -l que j'applique à la variable NB_LIGNE, j'initialise le compteur J à 1 j=1 et je lance une boucle d'affichage :
while [ $j -le $NB_LIGNE ]
do
cat routesref | sed -n "$j"p > fic_temp ICI (on va venir imprimer ligne par ligne dans ce fichier afin de récupérer diverses informations)
if [ -s fic_temp ]
then
adresse=`cat routesref | sed -n "$j"p | nawk -F" " '{print $1}'`
masque=`cat routesref | sed -n "$j"p | nawk -F" " '{print $2}'`
gateway=`cat routesref | sed -n "$j"p | nawk -F" " '{print $3}'`
echo ""$adresse":masque:"$gateway":" >> tmp
ETC ......
Seulement arrivé à la ligne où le sed effectue cette commande :
cat routesref | sed -n "$j"p > fic_temp ICI
J'ai le message d'erreur suivant (Pour pas chopper un ulcère des yeux reportez vous directement à j=2 car apparemment à j =1 sa passe). Le message d'erreur est sed: 2.p is an unrecognized command.:
NB_LIGNE= 110
+ j=1
+ [ 1 -le 110 ]
+ grep 255
+ cat /osp/applicatif_domaine_transverse/check_PFS/script_check_routes/route_ref/route_ref
+ sed -n 1p
+ 1> /osp/applicatif_domaine_transverse/result/result_check_route/verif
+ [ -s /osp/applicatif_domaine_transverse/result/result_check_route/verif ]
+ + cat /osp/applicatif_domaine_transverse/check_PFS/script_check_routes/route_ref/route_ref
+ nawk -F {print $1}
+ sed -n 1p
adresse=10.162.175.128
+ + cat /osp/applicatif_domaine_transverse/check_PFS/script_check_routes/route_ref/route_ref
+ nawk -F {print $2}
+ sed -n 1p
masque=255.255.255.128
+ + cat /osp/applicatif_domaine_transverse/check_PFS/script_check_routes/route_ref/route_ref
+ nawk -F {print $3}
+ sed -n 1p
gateway=10.162.175.126
+ echo 10.162.175.128:masque:10.162.175.126:
+ 1>> /osp/applicatif_domaine_transverse/result/result_check_route/tmp
+ + expr 1 + 1
j=2.
+ [ 2. -le 110 ]
+ grep 255
+ cat /osp/applicatif_domaine_transverse/check_PFS/script_check_routes/route_ref/route_ref
+ sed -n 2.p
+ 1> /osp/applicatif_domaine_transverse/result/result_check_route/verif
sed: 2.p is an unrecognized command.
+ [ -s /osp/applicatif_domaine_transverse/result/result_check_route/verif ]
+ + cat /osp/applicatif_domaine_transverse/check_PFS/script_check_routes/route_ref/route_ref
+ nawk -F {print $1}
+ sed -n 2.p
sed: 2.p is an unrecognized command.
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#10 Le 17/06/2015, à 17:22
- pingouinux
Re : Traitement fichier avec script
Tu compliques les choses de manière bien inutile…
L'erreur doit se situer au moment où tu incrémentes j (un point qui traîne à la fin de la ligne ?), mais comme tu ne montres qu'une portion de script, je ne peux pas préciser plus.
De plus, routesref contient apparemment 2 champs par ligne, et tu en lis 3.
Ajouté :
Et si tu essayes de faire ce que je crois, ceci devrait être équivalent (plus besoin de la boucle while)
sed -nr '/^$/d;s/ +/:/g;s/([^:])$/\1:/;p' routesref >tmp
Dernière modification par pingouinux (Le 17/06/2015, à 17:47)
Hors ligne
#11 Le 18/06/2015, à 10:54
- Beuhlet_Reseau
Re : Traitement fichier avec script
Tu compliques les choses de manière bien inutile…
L'erreur doit se situer au moment où tu incrémentes j (un point qui traîne à la fin de la ligne ?), mais comme tu ne montres qu'une portion de script, je ne peux pas préciser plus.
De plus, routesref contient apparemment 2 champs par ligne, et tu en lis 3.Ajouté :
Et si tu essayes de faire ce que je crois, ceci devrait être équivalent (plus besoin de la boucle while)sed -nr '/^$/d;s/ +/:/g;s/([^:])$/\1:/;p' routesref >tmp
Bien joué un "." c'était caché à l'autre bout de la console Ma boucle while me sert à formater mon fichier de cette façon :
Dans le cas où une ligne contient 3 champs :
<adresseIP>:<masque>:<passerelle>:
Si il y a que 2 champs
<adresseIP>:<masque>:<passerelle>:
Tous sa dans le but de formater quand je le souhaite ce fichier.
Ma boucle While ressemble à sa :
while [ $j -le $NB_LIGNE ]
do
cat $routesref | sed -n "$j"p | grep "255" > $verif
if [ -s $verif ]
then
adresse=`cat $routesref | sed -n "$j"p | nawk -F" " '{print $1}'`
masque=`cat $routesref | sed -n "$j"p | nawk -F" " '{print $2}'`
gateway=`cat $routesref | sed -n "$j"p | nawk -F" " '{print $3}'`
echo ""$adresse":masque:"$gateway":" >> $tmp
else
adresse=`cat $routesref | sed -n "$j"p | nawk -F" " '{print $1}'`
gateway=`cat $routesref | sed -n "$j"p | nawk -F" " '{print $2}'`
echo ""$adresse":masque:"$gateway":" >> $tmp
fi
j=`expr $j + 1`
done
Ce fichier me servira à comparer le fichier des routes dynamiques (qui aura été préalablement formater de la même façon).
Cette boucle SED m'a l'ère bien complexe !
Tu supprimes toutes les lignes vides, et après .... ?
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#12 Le 18/06/2015, à 17:17
- Beuhlet_Reseau
Re : Traitement fichier avec script
Dernière petite chose disons que j'ai un fichier de ce type Routes :
10.162.130.51:10.162.77.126
10.162.217.33:10.162.77.126
10.162.217.34:10.162.77.126
10.163.144.0/25:10.162.77.126
10.176.96.0/25:10.162.77.126
Dans tous sa je veux garder seulement l'adresse sans le masque.
Je fais ceci (redirection dans TMP) :
| grep "/" > TMP
10.163.144.0/25:10.162.77.126
10.176.96.0/25:10.162.77.126
Une fois mon fichier TMP crée, j'initialise 2 variable pour faire sauter le / :
variable1=`cat TMP | nawk -F":" '{print $1}'`
variable2=`cat TMP | nawk -F":" '{print $1}' | nawk -F"/" '{print $1}'`
Une fois ces 2 variables obtenues grâce à ce fichier TMP, j'applique ces variables au fichier Route :
cat Route | sed "s'$variable1'$variable2'g"
Mais ce message d'erreur apparaît :
sed: command garbled en local
Ou
RE First Not null... lors de exécution du script
Je veux seulement sa au final moi :
10.162.130.51:10.162.77.126
10.162.217.33:10.162.77.126
10.162.217.34:10.162.77.126
10.163.144.0:10.162.77.126
10.176.96.0:10.162.77.126
L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).
Hors ligne
#13 Le 18/06/2015, à 19:13
- pingouinux
Re : Traitement fichier avec script
Pour ce que tu veux faire en #12
sed -r 's#/[0-9]+:#:#' fichier_de_départ
Hors ligne