Extraire une chaine de caractere

lulustucru07 -  
brucine Messages postés 24882 Date d'inscription   Statut Membre Dernière intervention   -

Bonjour,

Je cherche à extraire une chaine de caractère de type "ip" dans un fichier txt à l'aide d'un script batch 

Exemple ci-dessous : 

Lucas  10.55.10.22
je suis toto
GGGG

Voici mon code batch : 

@echo off
setlocal enableextensions
set "file=C:\Users\lucas\Documents\script\test.txt"
for /f "tokens=1-4 delims=. " %%a in ('findstr /r /m "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" "%file%"') do (
    set "ip=%%a.%%b.%%c.%%d"
    goto :break
)
:break
echo Adresse IP est %ip%
endlocal

et donc celui-ci ne marche pas 

Merci de votre aide 

Bonne soirée 

Cordialement


Windows / Chrome 109.0.0.0

3 réponses

  1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     

    Bonjour,

    Ta regex est correcte, seulement tu as indiqué le commutateur /m de la commande FINDSTR, donc la commande te retourne uniquement le nom du fichier.

    Ton étiquette :break est inutile, voilà comment je vois les choses :

    @echo off
    setlocal enableextensions
    
    set "file=C:\Users\lucas\Documents\script\test.txt"
    set "ip="
    
    for /f "tokens=2" %%a in ('findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" "%file%"') do (
        if not defined ip (set "ip=%%a")
    )
    
    echo Adresse IP est %ip%
    endlocal
    
    pause


    1
    1. lulustucru07
       

      Ok je vous remercie ce code fonctionne !! mais je me rends compte que ce code prend en compte une position fixe dans le texte, n'est il pas possible de rechercher librement une chaine de type "ip" dans un texte peut importe sa position ?

      Merci de votre aide

      0
      1. lulustucru07 > lulustucru07
         

        Ok dernier question enfaite je cherche à réaliser cela sur un fichier de configuration pour l'application xemelios, ses paramètres sont stockés dans un fichier de conf : 

        user=xemelios
        password=Am/xL6*::
        database.url=jdbc\:mysql\://10.55.1.17/xemelios?jdbcCompliantTruncation\=false&dumpQueriesOnException\=true
        driver.class=com.mysql.jdbc.Driverv

        alidation.query=SELECT

        Mon but étant de capturer l'adresse IP présente dans le fichier de configuration et la stocker dans une variable, cette IP peut varier en fonction des fichiers de configuration d'ordinateur 

        Voilà et tout sa en batch, ce que je demandais précédemment servais pour test 

        Merci 

        0
      2. brucine Messages postés 24882 Date d'inscription   Statut Membre Dernière intervention   4 175 > lulustucru07
         

        Comme ça:

        for /f "tokens=2 delims=^//" %%a in ('findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" "%file%"') do (
            if not defined ip (set "ip=%%a")

        0
      3. lulustucru07 > brucine Messages postés 24882 Date d'inscription   Statut Membre Dernière intervention  
         

        Ok c'est parfait ça me va 

        Merci ????

        0
      4. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > lulustucru07
         

        C'est possible en faisant preuve d'imagination :

        @echo off
        setlocal enableextensions enabledelayedexpansion
        
        set "file=C:\Users\lucas\Documents\script\test.txt"
        
        set /a total=0
        
        for /f "tokens=*" %%a in ('findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" "%file%"') do (
        	set /a total+=1
        	call :routine "%%~a" && echo Adresse IP est : !ip!
        )
        
        if !total! equ 0 (echo ==^>^> Aucune adresse IP dans ce fichier)
        
        endlocal
        
        echo. & pause
        exit
        
        :routine
        set "restant=%~1"
        
        :boucle
        for /f "tokens=1,* delims=/= " %%A in ("!restant!") do set "chaine=%%~A" & set "restant=%%~B"
        echo !chaine! | findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" >nul && (set "ip=!chaine!" & exit /b 0)
        if defined restant (goto :boucle)
        
        exit /b 1
        0
  2. Utilisateur anonyme
     

    Bonjour

    Je ne connais pas batch et donc je ne sais pas répondre à ta seconde question.

    Par contre, j'ai une remarque sur la regex.

    Elle n'est pas assez restrictive pour ne capturer que des ip, voir cet exemple https://regex101.com/r/ot7Qqy/1

    Cela dit, si tu es sûr et certain que dans tes fichiers, une série de chiffres séparés par des point sera toujours une IP, elle peut suffire.

    Sinon, cette regex étant fortement utilisée, on la trouve partout sur le net https://lite.qwant.com/?q=regex+ip&client=opensearch


    0
    1. brucine Messages postés 24882 Date d'inscription   Statut Membre Dernière intervention   4 175
       

      Bonjour,

      On peut en effet raffiner la Regex pour spécifier que les séries de chiffres entre les points sont non seulement numériques mais obéissent à un format particulier, mais rien ne garantira jamais dans l'absolu qu'il s'agit d'une adresse IP.

      FINDSTR retournera la ligne contenant la chaîne recherchée, éventuellement la position de cette chaîne (début ou fin) mais est incapable de savoir si elle représente le deuxième ou le huitième mot (spécifié dans tokens, ici le deuxième).

      Autrement exprimé, je n'ai aucun moyen de la rechercher si elle n'est pas à une position fixe, ce qui amène une question subsidiaire: dépendant de par quelle commande est obtenu le fichier texte et dans quel contexte on le souhaite, on pourra alors se servir de la sortie de la commande en question, et non plus de FINDSTR pour retourner le résultat.

      Qui plus est, dans un texte qui serait "au kilomètre", cette syntaxe va échouer à retourner plusieurs adresses IP différentes qui y figureraient.

       

      0
      1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > brucine Messages postés 24882 Date d'inscription   Statut Membre Dernière intervention  
         

        Bonjour brucine,

        Effectivement FINDSTR est incapable de savoir la position de la chaîne, cependant on peut contourner ce problème en utilisant une boucle qui va analyser chaque token l'un après l'autre comme ceci :

        :routine
        set "restant=%~1"
        
        :boucle
        for /f "tokens=1,* delims=/= " %%A in ("!restant!") do set "chaine=%%~A" & set "restant=%%~B"
        echo !chaine! | findstr /r "[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*" >nul && (set "ip=!chaine!" & exit /b 0)
        if defined restant (goto :boucle)
        0
      2. brucine Messages postés 24882 Date d'inscription   Statut Membre Dernière intervention   4 175 > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
         

        Bonjour,

        J'en suis tout à fait d'accord, je n'ai fait que commenter le script en l'état (même chose pour partir à la chasse de plusieurs IP si c'est la cas).

        0
  3. Utilisateur anonyme
     

    Bonjour Brucine

    mais rien ne garantira jamais dans l'absolu qu'il s'agit d'une adresse IP.

    évidemment," Minimi Azabu 192.168.1.1" pourrait très bien correspondre à une adresse postale au Japon (j'ai jamais rien compris à leur système mais en gros c'est des divisions de secteurs successives), mais son format correspond aussi à un IP v4.

    Alors 1...1 qui ne correspond pas à une IP v4 est capturé par la regex actuelle, c'était juste cela que je voulais faire remarquer


    0
    1. brucine Messages postés 24882 Date d'inscription   Statut Membre Dernière intervention   4 175
       

      On peut faire une autre Regex qui vérifie que chaque segment contient de 1 à 3 chiffres sans autre donnée, qu'il ne s'y trouve pas de valeur numérique aberrante concernant une IP (par exemple 964.12.178.453), qu'il n'y a pas de caractère parasite par exemple alphabétique avant ou après (A192...), qui sera moins "mauvais" mais pas non plus garanti 100%.

      La seule manière d'avoir une telle garantie est d'extraire les IP réelles via Netstat, Netsh, Ipconfig, Powershell, wmic ou ce qu'on voudra dirigeant cette IP (dont on connaît alors l'emplacement dans la sortie) vers une variable.

      0