Extraire deux lignes d'un fichier à partir d'une seule info
Ka-El
Messages postés
260
Date d'inscription
Statut
Membre
Dernière intervention
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je suis confronté à une problématique et j'espère que vous allez pouvoir m'aider.
En effet, dans un gros fichier texte (que je nommerais TOTO.txt) rempli d'informations diverses je dois extraire toutes les lignes qui comportent l'adresse IP suivante "112.58.46.45" (exemple)
ça c'est simple...
Mais le problème c'est que je dois extraire aussi la ligne qui se trouve juste en dessous...
ce qui me donnerait le résultat suivant (exemple):
ligne x : blablablablablablablablablablabla112.58.46.45blablablablablablablablablablablabla
ligne x+1 : bablablablablablablablablablablablablablablablablablablablablablablablablablabla
Comment puis-je effectuer cette opération en ligne de commande ?
Merci d'avance pour votre aide.
Ka-El
Je suis confronté à une problématique et j'espère que vous allez pouvoir m'aider.
En effet, dans un gros fichier texte (que je nommerais TOTO.txt) rempli d'informations diverses je dois extraire toutes les lignes qui comportent l'adresse IP suivante "112.58.46.45" (exemple)
ça c'est simple...
Mais le problème c'est que je dois extraire aussi la ligne qui se trouve juste en dessous...
ce qui me donnerait le résultat suivant (exemple):
ligne x : blablablablablablablablablablabla112.58.46.45blablablablablablablablablablablabla
ligne x+1 : bablablablablablablablablablablablablablablablablablablablablablablablablablabla
Comment puis-je effectuer cette opération en ligne de commande ?
Merci d'avance pour votre aide.
Ka-El
A voir également:
- Extraire deux lignes d'un fichier à partir d'une seule info
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Extraire une video youtube - Guide
- Creer un groupe whatsapp a partir d'un autre groupe - Guide
7 réponses
hello
essayer
essayer
@echo off
set l=0
set s=112.58.46.45
set c=1
setlocal enabledelayedexpansion
for /f "delims=" %%a In (TOTO.txt) Do (
echo %%a | findstr %s% > NUL
if !errorlevel! EQU 0 (echo %%a& set /a l=!c!+1)
if !c! EQU !l! echo %%a
set /a c+=1
)
non
que contient toto.txt ?
que contient toto.txt ?
C:> type toto.txt
Mais le problÞme c'est que je dois extraire aussi la ligne qui se trouve juste en dessous...
ce qui me donnerait le rÚsultat suivant (exemple):
ligne x : blablablablablablablablablablabla112.58.46.45blablablablablablablablablablablabla
ligne x+1 : bablablablablablablablablablablablablablablablablablablablablablablablablablabla
Comment puis-je effectuer cette opÚration en ligne de commande ?
Merci d'avance pour votre aide.
C:>
C:> type dd.bat
@echo off
set l=0
set s=112.58.46.45
set c=1
setlocal enabledelayedexpansion
for /f "delims=" %%a In (TOTO.txt) Do (
echo %%a | findstr %s% > NUL
if !errorlevel! EQU 0 (echo %%a& set /a l=!c!+1)
if !c! EQU !l! echo %%a
set /a c+=1
)
C:> dd
ligne x : blablablablablablablablablablabla112.58.46.45blablablablablablablablablablablabla
ligne x+1 : bablablablablablablablablablablablablablablablablablablablablablablablablablabla
C:>
Toto.txt contient ce type d'information:
JlKqVzqhNwA 20160809 235902 011 SECS I SES_INIT (71373125) Netprof : PHSE6330 selected [src_addr="112.58.46.45/59522"] [dest_addr="127.0.0.1/6330"]
JlKqVzqhNwA 20160809 235902 013 SECS I SES_INIT (71373125) Server TLS Security Profile : S_C2B_SRVR_6330 selected
JlKqVzqhNwA 20160809 235902 103 NET I CONN_RESP (69947) incoming connection response [resp_add=""]
JlKqVzqhNwA 20160809 235902 106 NET I DISC_IND (69947) disconnection indication [reason="No error (0x0)"] [origin="0"]
JlKqVzqhNwA 20160809 235902 011 SECS I SES_INIT (71373125) Netprof : PHSE6330 selected [src_addr="112.58.46.45/59522"] [dest_addr="127.0.0.1/6330"]
JlKqVzqhNwA 20160809 235902 013 SECS I SES_INIT (71373125) Server TLS Security Profile : S_C2B_SRVR_6330 selected
JlKqVzqhNwA 20160809 235902 103 NET I CONN_RESP (69947) incoming connection response [resp_add=""]
JlKqVzqhNwA 20160809 235902 106 NET I DISC_IND (69947) disconnection indication [reason="No error (0x0)"] [origin="0"]
Non malheureusement j'obtiens toujours un écran noir...
C'est curieux, il n'y a même pas de message d'erreur. C'est comme si, il ne trouvait pas l'information.
Même si je lance actuellement le script dans le même dossier que le fichier TOTO.txt, dans le doute j'ai précisé l'arborescence où se trouve le fichier, :
for /f "delims=" %%a In (D:\dossier\TOTO.txt) Do (
Mais j'obtiens toujours le même résultat...
C'est curieux, il n'y a même pas de message d'erreur. C'est comme si, il ne trouvait pas l'information.
Même si je lance actuellement le script dans le même dossier que le fichier TOTO.txt, dans le doute j'ai précisé l'arborescence où se trouve le fichier, :
for /f "delims=" %%a In (D:\dossier\TOTO.txt) Do (
Mais j'obtiens toujours le même résultat...
Oui en effet, les deux caractères apparaissent.
Ils peuvent se présenter séparé ("<" ou ">") ou même ensemble ("<>")
Ils peuvent se présenter séparé ("<" ou ">") ou même ensemble ("<>")
Bonjour
je ne connais rien en AutoIt, mais il existe un outil "universel" qui répond à ton besoin: les Regex (ou expressions régulières), j'ai vérifié ça existe aussi en AutoIt.
Une regex permet de chercher et d'extraire d'un texte, 1 ou plusieurs morceaux correspondant à un modèle (pattern).
C'est la syntaxe de ce modèle qui est universelle, la façon dont c'est implémenté dépend du langage.
https://www.autoitscript.fr/autoit3/docs/functions/StringRegExp.htm
Pour le modèle, ou sait qu'il doit y avoir 4 séries de 1 à 3 chiffres. S'il y a 3 chiffres le premiers ne peut être que 0,1 ou 2, et si c'est 2 le deuxième ne peut être que 0,1,2,3,4 ou 5 et si c'est 5 et bien le 3eme ne peut être que 0,1,2,3,4 ou 5. Enfin ces 4 séries sont séparées par un point.
Voici une syntaxe qui correspond au modèle que je viens de décrire
Cependant elle autorise 0.0.0.0 ou 1.1.1.1 qui ne devraient pas être autorisés, on doit pouvoir l'améliorer si tu le souhaites.
Il existe plein de sites permettant de tester des regex.
https://www.google.fr/?gfe_rd=cr&ei=mC-sV4b8J9aBaL_CkVg#q=regex+tester
je ne connais rien en AutoIt, mais il existe un outil "universel" qui répond à ton besoin: les Regex (ou expressions régulières), j'ai vérifié ça existe aussi en AutoIt.
Une regex permet de chercher et d'extraire d'un texte, 1 ou plusieurs morceaux correspondant à un modèle (pattern).
C'est la syntaxe de ce modèle qui est universelle, la façon dont c'est implémenté dépend du langage.
https://www.autoitscript.fr/autoit3/docs/functions/StringRegExp.htm
Pour le modèle, ou sait qu'il doit y avoir 4 séries de 1 à 3 chiffres. S'il y a 3 chiffres le premiers ne peut être que 0,1 ou 2, et si c'est 2 le deuxième ne peut être que 0,1,2,3,4 ou 5 et si c'est 5 et bien le 3eme ne peut être que 0,1,2,3,4 ou 5. Enfin ces 4 séries sont séparées par un point.
Voici une syntaxe qui correspond au modèle que je viens de décrire
((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
Cependant elle autorise 0.0.0.0 ou 1.1.1.1 qui ne devraient pas être autorisés, on doit pouvoir l'améliorer si tu le souhaites.
Il existe plein de sites permettant de tester des regex.
https://www.google.fr/?gfe_rd=cr&ei=mC-sV4b8J9aBaL_CkVg#q=regex+tester
Salut,
Dans son cas précis, les regex ne lui seront d'aucun secours dans la mesure où il connait le pattern recherché ;-\
Il a juste besoin d'un outil plus adapté qui l'aiderait à récupérer le pattern recherché et la ligne suivante.
Sous GNU/Linux il existe la commande
Pour ceux qui ont la chance (ou la malchance c'est au choix ;-) ) d'avoir la dernière mouture de Windows 10, Micro$oft a eu la très bonne idée d'y intégrer le shell bash de GNU/Linux, donc de ce fait la fameuse commande grep…
Dans son cas précis, les regex ne lui seront d'aucun secours dans la mesure où il connait le pattern recherché ;-\
Il a juste besoin d'un outil plus adapté qui l'aiderait à récupérer le pattern recherché et la ligne suivante.
Sous GNU/Linux il existe la commande
grepqui fait ça très bien :
grep -A1 'pattern' /chemin/fichier
Pour ceux qui ont la chance (ou la malchance c'est au choix ;-) ) d'avoir la dernière mouture de Windows 10, Micro$oft a eu la très bonne idée d'y intégrer le shell bash de GNU/Linux, donc de ce fait la fameuse commande grep…
Bonjour, c'est une option.
Par contre je ne comprends pas cet argument
Si tu ne connais pas le pattern, tu ne peux pas faire de regex.
Dans ce cas, il est relativement simple oui, il y a d'autres solutions aussi, mais le fait de savoir que ça existe pourrait servir une autre fois.
Par contre je ne comprends pas cet argument
précis, les regex ne lui seront d'aucun secours dans la mesure où il connait le pattern recherché ;-\
Si tu ne connais pas le pattern, tu ne peux pas faire de regex.
Dans ce cas, il est relativement simple oui, il y a d'autres solutions aussi, mais le fait de savoir que ça existe pourrait servir une autre fois.
Re- (sans option)
Je le cite :
D'où ma réflexion, qui commençait bien par "Dans son cas précis".
De plus, son besoin c'est surtout de récupérer aussi la ligne suivante, d'où ma proposition d'un outil plus adapté (
Par contre je ne comprends pas cet argument
Je le cite :
je dois extraire toutes les lignes qui comportent l'adresse IP suivante "112.58.46.45"
D'où ma réflexion, qui commençait bien par "Dans son cas précis".
De plus, son besoin c'est surtout de récupérer aussi la ligne suivante, d'où ma proposition d'un outil plus adapté (
grepen l'occurrence).
Et aussi je me suis mal exprimé, l'option c'est la regex.
Pas le bonjour... Lui est primordial.
En restant dans l'idée regex, il faudrait alors chercher un retour à la ligne , suivi de n'importe quel caractère (sauf fin de ligne) 0 à n foi, puis l'ip et enfin de n'importe sauf fin de ligne 9 à n fois et fin de ligne.
Pas le bonjour... Lui est primordial.
En restant dans l'idée regex, il faudrait alors chercher un retour à la ligne , suivi de n'importe quel caractère (sauf fin de ligne) 0 à n foi, puis l'ip et enfin de n'importe sauf fin de ligne 9 à n fois et fin de ligne.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Salut.
@Whismeril : l'idée des regex est excellente, pour ceux ou celles qui savent s'en servir. ^^
On peut s'en passer, avec un simple StringInStr dans une boucle FOR.
En résumé :
On récupère la ligne où contient l'ip et le numéro de ligne
On récupère la ligne suivante (le numéro de ligne précédent + 1).
Si ça t'intéresse, je peux te le faire ;)
@++
@Whismeril : l'idée des regex est excellente, pour ceux ou celles qui savent s'en servir. ^^
On peut s'en passer, avec un simple StringInStr dans une boucle FOR.
En résumé :
On récupère la ligne où contient l'ip et le numéro de ligne
On récupère la ligne suivante (le numéro de ligne précédent + 1).
Si ça t'intéresse, je peux te le faire ;)
@++
Salut.
Juste une petite remarque :
Pourquoi ne pas détecter la ligne contenant src_addr=" ?
Quand tu auras le numéro de cette ligne, tu pourras donc également obtenir le numéro de la ligne suivante.
En batch, je laisse Mr dubcek faire, il est plus calé que moi. ^^
Mais dans les autres langages, une recherche d'un string dans une ligne, dans une boucle for suffit pour récupérer ces lignes.
@++
Juste une petite remarque :
Toto.txt contient ce type d'information:
JlKqVzqhNwA 20160809 235902 011 SECS I SES_INIT (71373125) Netprof : PHSE6330 selected [src_addr="112.58.46.45/59522"] [dest_addr="127.0.0.1/6330"]
JlKqVzqhNwA 20160809 235902 013 SECS I SES_INIT (71373125) Server TLS Security Profile : S_C2B_SRVR_6330 selected
JlKqVzqhNwA 20160809 235902 103 NET I CONN_RESP (69947) incoming connection response [resp_add=""]
JlKqVzqhNwA 20160809 235902 106 NET I DISC_IND (69947) disconnection indication [reason="No error (0x0)"] [origin="0"]
Pourquoi ne pas détecter la ligne contenant src_addr=" ?
Quand tu auras le numéro de cette ligne, tu pourras donc également obtenir le numéro de la ligne suivante.
En batch, je laisse Mr dubcek faire, il est plus calé que moi. ^^
Mais dans les autres langages, une recherche d'un string dans une ligne, dans une boucle for suffit pour récupérer ces lignes.
@++
Salut.
j'avoue que le batch est plus difficile pour ce type de travaux que les autres langages.
J'ai fait un petit script AutoIT qui m'affiche dans un msgbox les lignes que tu veux.
Tu vois pourquoi je préfère passer en AutoIT pour ce genre de chose ?
Et étant donne que c'est un VB-LIke, en visual basic, ça peut se faire.
++
j'avoue que le batch est plus difficile pour ce type de travaux que les autres langages.
J'ai fait un petit script AutoIT qui m'affiche dans un msgbox les lignes que tu veux.
#include <File.au3>
$fichier = @DesktopDir & "\toto.txt"
For $a = 1 To _FileCountLines($fichier)
If StringInStr(FileReadLine($fichier, $a), 'src_addr=') Then
MsgBox(0, "", FileReadLine($fichier, $a))
MsgBox(0, "", FileReadLine($fichier, $a + 1))
EndIf
Next
Tu vois pourquoi je préfère passer en AutoIT pour ce genre de chose ?
Et étant donne que c'est un VB-LIke, en visual basic, ça peut se faire.
++
exécuter ce script dans une fenêtre cmd, pas par double clique
affichier le contenu de toto.txt
affichier le contenu de toto.txt
@echo off
set l=0
set s=112.58.46.45
set c=1
setlocal enabledelayedexpansion
for /f "delims=" %%a In (TOTO.txt) Do (
echo "%%a" | findstr %s% > NUL
if !errorlevel! EQU 0 (echo %%a& set /a l=!c!+1)
if !c! EQU !l! echo %%a
set /a c+=1
)
Salut Dubcek,
Voici ce que j'ai saisi dans la fenêtre cmd:
D:\dossier\log>set l=0
D:\dossier\log>set s=112.58.46.45
D:\dossier\log>set c=1
D:\dossier\log>setlocal enabledelayedexpansion
D:\Axway\Synchrony\Gateway\run_time\fse>for /f "delims=" %a In (TOTO.txt) Do (
More? echo "%a" | findstr %s% > NUL
More? if !errorlevel! EQU 0 (echo %a& set /a l=!c!+1)
More? if !c! EQU !l! echo %a
More? set /a c+=1
More? )
Et voici une partie du résultat:
(...)
9
D:\Axway\Synchrony\Gateway\run_time\fse>(
echo " JlKqVzqhNwA 20160809 235902 106 NET I DISC_IND (69947
) disconnection indication [reason="No error (0x0)"] [origin="0"]" | f
indstr 112.58.46.45 1>NUL
if !errorlevel! EQU 0 (echo JlKqVzqhNwA 20160809 235902 106 N
ET I DISC_IND (69947) disconnection indication [reason="No error (0x0
)"] [origin="0"] & set /a l=!c!+1 )
if !c! EQU !l! echo JlKqVzqhNwA 20160809 235902 106 NET I D
ISC_IND (69947) disconnection indication [reason="No error (0x0)"] [ori
gin="0"]
set /a c+=1
)
10
D:\Axway\Synchrony\Gateway\run_time\fse>(
echo " JlKqVzuhNwA 20160809 235902 102 NET I CONN_IND (69948
) incoming connection indication [src_add="127.0.0.1/64993",dest_add="127.0.0.
1/64572"]" | findstr 112.58.46.45 1>NUL
if !errorlevel! EQU 0 (echo JlKqVzuhNwA 20160809 235902 102 N
ET I CONN_IND (69948) incoming connection indication [src_add="127.0.0.1/64
993",dest_add="127.0.0.1/64572"] & set /a l=!c!+1 )
if !c! EQU !l! echo JlKqVzuhNwA 20160809 235902 102 NET I C
ONN_IND (69948) incoming connection indication [src_add="127.0.0.1/64993",des
t_add="127.0.0.1/64572"]
set /a c+=1
)
11
D:\Axway\Synchrony\Gateway\run_time\fse>(
echo " JlKqVzuhNwA 20160809 235902 103 NET I CONN_RESP (69948
) incoming connection response [resp_add=""]" | findstr 112.58.46.45 1 >NUL
if !errorlevel! EQU 0 (echo JlKqVzuhNwA 20160809 235902 103 N
ET I CONN_RESP (69948) incoming connection response [resp_add=""] & set /
a l=!c!+1 )
if !c! EQU !l! echo JlKqVzuhNwA 20160809 235902 103 NET I C
ONN_RESP (69948) incoming connection response [resp_add=""]
set /a c+=1
)
12
(...)
Voici ce que j'ai saisi dans la fenêtre cmd:
D:\dossier\log>set l=0
D:\dossier\log>set s=112.58.46.45
D:\dossier\log>set c=1
D:\dossier\log>setlocal enabledelayedexpansion
D:\Axway\Synchrony\Gateway\run_time\fse>for /f "delims=" %a In (TOTO.txt) Do (
More? echo "%a" | findstr %s% > NUL
More? if !errorlevel! EQU 0 (echo %a& set /a l=!c!+1)
More? if !c! EQU !l! echo %a
More? set /a c+=1
More? )
Et voici une partie du résultat:
(...)
9
D:\Axway\Synchrony\Gateway\run_time\fse>(
echo " JlKqVzqhNwA 20160809 235902 106 NET I DISC_IND (69947
) disconnection indication [reason="No error (0x0)"] [origin="0"]" | f
indstr 112.58.46.45 1>NUL
if !errorlevel! EQU 0 (echo JlKqVzqhNwA 20160809 235902 106 N
ET I DISC_IND (69947) disconnection indication [reason="No error (0x0
)"] [origin="0"] & set /a l=!c!+1 )
if !c! EQU !l! echo JlKqVzqhNwA 20160809 235902 106 NET I D
ISC_IND (69947) disconnection indication [reason="No error (0x0)"] [ori
gin="0"]
set /a c+=1
)
10
D:\Axway\Synchrony\Gateway\run_time\fse>(
echo " JlKqVzuhNwA 20160809 235902 102 NET I CONN_IND (69948
) incoming connection indication [src_add="127.0.0.1/64993",dest_add="127.0.0.
1/64572"]" | findstr 112.58.46.45 1>NUL
if !errorlevel! EQU 0 (echo JlKqVzuhNwA 20160809 235902 102 N
ET I CONN_IND (69948) incoming connection indication [src_add="127.0.0.1/64
993",dest_add="127.0.0.1/64572"] & set /a l=!c!+1 )
if !c! EQU !l! echo JlKqVzuhNwA 20160809 235902 102 NET I C
ONN_IND (69948) incoming connection indication [src_add="127.0.0.1/64993",des
t_add="127.0.0.1/64572"]
set /a c+=1
)
11
D:\Axway\Synchrony\Gateway\run_time\fse>(
echo " JlKqVzuhNwA 20160809 235902 103 NET I CONN_RESP (69948
) incoming connection response [resp_add=""]" | findstr 112.58.46.45 1 >NUL
if !errorlevel! EQU 0 (echo JlKqVzuhNwA 20160809 235902 103 N
ET I CONN_RESP (69948) incoming connection response [resp_add=""] & set /
a l=!c!+1 )
if !c! EQU !l! echo JlKqVzuhNwA 20160809 235902 103 NET I C
ONN_RESP (69948) incoming connection response [resp_add=""]
set /a c+=1
)
12
(...)
avec des données théoriques, ca fonctionne
C:> type toto.txt
ligne 1
ligne 2
ligne 3
ligne 4 [src_addr="112.58.46.45/59522"] [dest_addr="127.0.0.1/6330"]
ligne 5
ligne 6
C:> type dd.bat
@echo off
set l=0
set s=112.58.46.45
set c=1
setlocal enabledelayedexpansion
for /f "delims=" %%a In (TOTO.txt) Do (
echo "%%a" | findstr %s% > NUL
if !errorlevel! EQU 0 (echo %%a& set /a l=!c!+1)
if !c! EQU !l! echo %%a
set /a c+=1
)
C:> dd
ligne 4 [src_addr="112.58.46.45/59522"] [dest_addr="127.0.0.1/6330"]
ligne 5
Pour l'instant le script répond par cette suite de lignes:
> was unexpected at this time.
> was unexpected at this time.
> was unexpected at this time.
etc...
Sais-tu pourquoi ?
Merci.