Extraire une chaine de caractere

Fermé
lulustucru07 - 18 janv. 2023 à 22:39
brucine Messages postés 14341 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 avril 2024 - 19 janv. 2023 à 12:26

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

A voir également:

3 réponses

barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908
Modifié le 18 janv. 2023 à 23:42

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
lulustucru07
19 janv. 2023 à 07:57

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
lulustucru07 > lulustucru07
19 janv. 2023 à 09:47

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
brucine Messages postés 14341 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 avril 2024 1 818 > lulustucru07
19 janv. 2023 à 09:53

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
lulustucru07 > brucine Messages postés 14341 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 avril 2024
19 janv. 2023 à 09:55

Ok c'est parfait ça me va 

Merci ????

0
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908 > lulustucru07
Modifié le 19 janv. 2023 à 10:29

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
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931
19 janv. 2023 à 08:49

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
brucine Messages postés 14341 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 avril 2024 1 818
19 janv. 2023 à 09:47

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
barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024 4 908 > brucine Messages postés 14341 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 avril 2024
Modifié le 19 janv. 2023 à 10:39

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
brucine Messages postés 14341 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 avril 2024 1 818 > barnabe0057 Messages postés 14440 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 19 avril 2024
19 janv. 2023 à 10:39

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
Whismeril Messages postés 19032 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 28 avril 2024 931
19 janv. 2023 à 10:51

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
brucine Messages postés 14341 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 28 avril 2024 1 818
19 janv. 2023 à 12:26

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