[sed] Remplacement d'une chaine de caractaire

Résolu
jonigood Messages postés 481 Statut Membre -  
jonigood Messages postés 481 Statut Membre -
salut a tous CCMien et merci de me lire.

Je suis a la recherche d'une commande sed pour modifier une chaine de caractère aléatoire dans un ficher texte précis.... j'explique

J'ai un fichier "FICHIER.txt" qui contient plusieurs centaines de lignes dont une ligne avec une adresse IP sous cette forme :

ADRESSE_IP = 158.365.456.87

J'ai un deuxièmes fichier IP.txt qui contient des adresses IP (9 IP au totale)

le but est de remplacer l'adresse IP du ficher "FICHIER.txt" toute les minutes par une des 9 adresses IP contenu dans le fichier IP.txt, il doit donc y avoir 9 changement d'IP en 9 minute.

Je pense a une tache cron qui exécuterai un script shell toute les minutes en utilisant la commande sed, par exemple la simple commande :

sed 's/ANCIEN-IP/NOUVELLE-IP/g' FICHIER.txt

fera l'affaire pour remplacer une seule fois l'IP du ficher "FICHIER.txt" par une unique autre adresse IP ce qui n'est pas le but.

Comment faire pour avoir une rotation des IP de remplacement en utilisant sed ?

Toute autre solution autre que la commande sed est la bien venu (grep, awk...)

Merci a tous d'avance

jonigood.

5 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    Et avec un "sleep", ça pourrait le faire aussi...

    $ cat fich.txt                  
    Mon IP: 192.168.0.1    
             
    $ cat ip.txt                    
    192.168.0.2                     
    192.168.0.3                     
    192.168.0.4                     
    192.168.0.5                     
    192.168.0.6
    192.168.0.7
    192.168.0.8
    192.168.0.9
    192.168.0.10
    
    $ cat foo.sh
    #! /bin/bash
    
    while read line
    do
    sed "s/\(.*\) .*/\1 ${line}/" fich.txt
    echo "Attente ....."
    sleep 3     # A remplacer par 60
    done < ip.txt
    
    $ ./foo.sh
    Mon IP: 192.168.0.2
    Attente .....
    Mon IP: 192.168.0.3
    Attente .....
    Mon IP: 192.168.0.4
    Attente .....
    Mon IP: 192.168.0.5
    Attente .....
    etc.
    etc.
    $

    ;-))
    2
    1. jonigood Messages postés 481 Statut Membre 28
       
      salut zipe31

      Ta solution ne fonctionne pas
      Le compteur ce met bien en route, par contre aucun changement dans le fich.txt ...
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Re-

      Normal, la syntaxe dans mon script ne fait qu'afficher le résultat sans modifier le fichier d'origine (fich.txt) par souci se sécurité et de test...

      Pour que le changement soit effectif il suffit d'ajouter l'option "-i" (--in-place) à la commande sed ;-))

      sed -i "s/\(.*\) .*/\1 ${line}/" fich.txt
      0
    3. jonigood Messages postés 481 Statut Membre 28
       
      yes !

      sa fonctionne, je suis gâté aujourd'hui :-)

      merci
      0
    4. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      De rien ;-)

      Petite précision : La regex s'applique uniquement au format de la ligne "Mon IP: xxx.xxx.xxx.xxx" du fichier "fich.txt".
      Si le format diffère, il faudra adapter la regex en fonction.
      0
    5. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      Oui, mais comme j'étais en train de sleep quand j'ai écrit je ne me suis même pas rendu compte ;-)))
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Une idée c'est de créer un fichier compteur qui incremente à chaque exécution de script
    Je n'ai pas testé avec cron.
    Pour cron il faudrait mettre les chemin complet des fichiers et commandes

    lami20j@debian-acer:~$ cat fichier.txt  
    Mon IP: 192.168.0.1 
    lami20j@debian-acer:~$ cat IP.txt  
    192.168.0.2 
    192.168.0.3 
    192.168.0.4 
    192.168.0.5 
    192.168.0.6 
    192.168.0.7 
    192.168.0.8 
    192.168.0.9 
    192.168.0.10 
    lami20j@debian-acer:~$ cat IP.compteur  
    1 
    lami20j@debian-acer:~$ cat changeIP.sh  
    #!/bin/bash 
    
    n=$(cat IP.compteur) 
    IP_OLD=$(egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}' fichier.txt) 
    IP_NEW=$(egrep -m $n '([0-9]{1,3}\.){3}[0-9]{1,3}' IP.txt |tail -1)  
    sed -i 's/'"$IP_OLD"'/'"$IP_NEW"'/' fichier.txt 
    echo $((n+1)) > IP.compteur 
    if [ $n = "9" ] 
    then 
    echo 1 > IP.compteur 
    fi 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.2 
    2 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.3 
    3 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.4 
    4 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.5 
    5 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.6 
    6 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.7 
    7 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.8 
    8 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.9 
    9 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.10 
    1 
    lami20j@debian-acer:~$ sh changeIP.sh  
    lami20j@debian-acer:~$ cat fichier.txt IP.compteur  
    Mon IP: 192.168.0.2 
    2


    GNU/Linux:Linux is Not Ubuntu! Quel linux choisir ne veut pas dire votre Distribution préférée,
    106485010510997108
    0
    1. jonigood Messages postés 481 Statut Membre 28
       
      yep ^^
      0
  3. jonigood Messages postés 481 Statut Membre 28
     
    salut l'ami

    Encore une fois l'ami20j claire net et précis , sa fonctionne du premier coup !

    Je trouverai bien une solution un jour ou l'autre pour te dire MERCI !!!!!!!!

    thankSSSSS
    0
  4. jonigood Messages postés 481 Statut Membre 28
     
    De retour

    Vous pouvez m'adapter la regex a une autre chaine de caractère SVP ? J'ai vraiment du mal avec les regex

    remplacer :

    Mon IP: 192168.0.1
    Par
    smtp_bind_address = 192.168.0.1

    Merci d'avance

    PS: lami20j stp peut tu me renvoyer le lien que tu ma filé il y a pas longtemps pour les regex je le trouve plus :-(
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Avec mon script il n'y a rien à changer, ça marchera aussi bien avec
      "smtp_bind_address = 192.168.0.1"
      qu'avec "Mon IP: 192168.0.1"

      ;-))
      0
    2. jonigood Messages postés 481 Statut Membre 28
       
      Sa fonctionne partiellement ...

      Comme je le précise plus haut dans ce fichier main.cf qui est fichier de conf de postfix il y a plusieurs ligne qui ont la même forme, voici un bout de ce fichier :

      smtp_use_tls = yes
      smtp_tls_note_starttls_offer = yes
      smtpd_tls_auth_only = yes
      smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
      smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
      smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
      smtpd_tls_loglevel = 1


      Avec ton script (ce qui est logique) sa remplace toutes les lignes par :

      smtp_use_tls = 192.168.0.2
      smtp_tls_note_starttls_offer = 192.168.0.2
      smtpd_tls_auth_only = 192.168.0.2
      smtpd_tls_key_file = 192.168.0.2
      smtpd_tls_cert_file = 192.168.0.2
      smtpd_tls_CAfile = 192.168.0.2
      smtpd_tls_loglevel = 192.168.0.2

      :-)
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      D'où l'intérêt d'afficher des exemples CONCRETS ;-((

      Par contre je ne vois nullement dans ton bout de fichier de "smtp_bind_address" ;-\

      C'est bien cette ligne que tu veux remplacer chaque minute ?
      0
    4. jonigood Messages postés 481 Statut Membre 28
       
      oui excuse pour l'imprécision,

      il y a bien la ligne smtp_bind_address dans ce fichier je n'est copier que quelques lignes a titre indicatif

      merci
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      $ cat fich.txt  
      smtp_use_tls = yes                 
      smtp_tls_note_starttls_offer = yes 
      smtpd_tls_auth_only = yes          
      smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
      smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
      smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem  
      smtpd_tls_loglevel = 1                          
      smtp_bind_address = 192.168.0.1                 
      
      $ cat foo.sh               
      #! /bin/bash                                  
      
      while read line
      do             
      sed "/^smtp_bind_address/ s/\(.*\) .*/\1 ${line}/" fich.txt
      echo "Attente ....."                                       
      sleep 3     # A remplacer par 60                           
      done < ip.txt        
                                            
      $ ./foo.sh                            
      smtp_use_tls = yes                                       
      smtp_tls_note_starttls_offer = yes                       
      smtpd_tls_auth_only = yes                                
      smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
      smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
      smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
      smtpd_tls_loglevel = 1
      smtp_bind_address = 192.168.0.2
      Attente .....
      smtp_use_tls = yes
      smtp_tls_note_starttls_offer = yes
      smtpd_tls_auth_only = yes
      smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
      smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
      smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
      smtpd_tls_loglevel = 1
      smtp_bind_address = 192.168.0.3
      Attente .....
      smtp_use_tls = yes
      smtp_tls_note_starttls_offer = yes
      smtpd_tls_auth_only = yes
      smtpd_tls_key_file = /etc/postfix/ssl/smtpd.key
      smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.crt
      smtpd_tls_CAfile = /etc/postfix/ssl/cacert.pem
      smtpd_tls_loglevel = 1
      smtp_bind_address = 192.168.0.4
      Attente .....
      etc.
      etc.
      ...
      $
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jonigood Messages postés 481 Statut Membre 28
     
    A oué !

    J'ai trouver héhéhé
    Mesdames et Messieurs voici la plus grande base de donner de regex dispo sur le web !

    A consommé SANS modération, Profitez en :

    CLIQUEZ ICI

    MDR
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Il ne faut pas exagérer quand même.
      Cette fois-ci ne l'oublie pas https://docstore.mik.ua/orelly/perl4/mre/
      0
    2. jonigood Messages postés 481 Statut Membre 28
       
      cool

      thanks
      0