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 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 big_smile
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

pingouinux a écrit :

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 cool

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

pingouinux a écrit :

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) hmm. 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

pingouinux a écrit :

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

pingouinux a écrit :

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