[SHELL] Remplacer un chaine précise dans un fichier

Remplacer un chaine précise dans un fichier [SHELL] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 26-03-2010 à 16:21:13    

Bonjour,  
 
Je suis en train de mettre un script en place pour configurer les différents services qui seront présent sur des serveurs RHEL.  
 
Et je souhaite modifier une ligne ou plus précisément un numéro de port pour une ligne dans le fichier /etc/services.  
 
Voici la ligne que je souhaite modifier :  
 
ndmp            9000/tcp                        # BackupExec
 
en  
 
ndmp            10000/tcp                        # BackupExec
 
J'utilise donc sed de cet manière :  
 
cat /etc/services | sed -e "s/9000/10000/g" > /etc/services.new
 
Donc çà remplace bien le 9000 par le 10000 pour les deux lignes mais le souci est que çà remplace aussi le 9000 pour le port 19000 du coup dans mon fichier j'ai aussi les deux lignes suivantes qui sont modifiées :  
 
igrid           19000/tcp                       # iGrid Server
igrid           19000/udp                       # iGrid Server
 
et qui deviennent  
 
igrid           110000/tcp                       # iGrid Server
igrid           110000/udp                       # iGrid Server
 
Je n'arrive pas à trouver d'option pour dire je veux remplacer uniquement la chaine "9000" et pas la "19000".  
Auriez-vous une idée ?  
 
Par avance merci
 
 
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 26-03-2010 à 16:21:13   

Reply

Marsh Posté le 26-03-2010 à 16:27:07    

1/ utiliser sed -i pour ce genre de choses
2/ on ne modifie pas /etc/services, c'est des manières de goret
3/ utiliser une regexp qui spécifie que le 9000 doit être précédé d'un espace me semble bien


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Marsh Posté le 26-03-2010 à 16:30:36    

Quelque chose comme ca peut etre  
 

Code :
  1. sed -i .bak 's/ 9000/ 10000/g' /etc/services


 
Mais je suis d'accord que ce n'est pas idéal de jouer avec ce fichier. Pourquoi ne pas spécifier directement à ton service de fonctionner sur un port spécifique ?


Message édité par kisscoolz le 26-03-2010 à 16:31:44
Reply

Marsh Posté le 26-03-2010 à 16:30:36    

cosca14 a écrit :

Bonjour,  
 
Je suis en train de mettre un script en place pour configurer les différents services qui seront présent sur des serveurs RHEL.  
 
Et je souhaite modifier une ligne ou plus précisément un numéro de port pour une ligne dans le fichier /etc/services.  
 
Voici la ligne que je souhaite modifier :  
 
ndmp            9000/tcp                        # BackupExec
 
en  
 
ndmp            10000/tcp                        # BackupExec
 
J'utilise donc sed de cet manière :  
 
cat /etc/services | sed -e "s/9000/10000/g" > /etc/services.new
 
Donc çà remplace bien le 9000 par le 10000 pour les deux lignes mais le souci est que çà remplace aussi le 9000 pour le port 19000 du coup dans mon fichier j'ai aussi les deux lignes suivantes qui sont modifiées :  
 
igrid           19000/tcp                       # iGrid Server
igrid           19000/udp                       # iGrid Server
 
et qui deviennent  
 
igrid           110000/tcp                       # iGrid Server
igrid           110000/udp                       # iGrid Server
 
Je n'arrive pas à trouver d'option pour dire je veux remplacer uniquement la chaine "9000" et pas la "19000".  
Auriez-vous une idée ?  
 
Par avance merci


Il faudrait prendre la ligne entière  

Citation :


cat /etc/services | sed -e "s/9000\/tcp/10000\/tcp/g" > /etc/services.new


devrait faire l'affaire.
A noter cependant pour la petite histoire que /etc/services n'est pas forcément utiliser par les daemons pour configurer leur port d'écoute tcp/udp... bref la configuration des services n'a pas forcément de raison de se trouver là...


---------------
Intermittent du GNU
Reply

Marsh Posté le 26-03-2010 à 17:04:19    

awk '$1~/^[nN][dD][mM][pP]/ && $2~/^9000\/tcp/ {sub("9000","10000", $0); print $0}' /etc/hosts >/etc/hosts.maj


 
Ça effectue le remplacement voulu, avec un maximum de fiabilité.
Si le formatage des lignes n'est pas important pour toi, sub("9000","10000", $2) est encore plus fiable que sub("9000","10000", $0).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed