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   -
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
A voir également:

7 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
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
)

0
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour Dubcek,
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.
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
non
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:>
0
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
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"]
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
ya-t-il des < > dans le fichier ? c'est le probleme
essayer en changeant la ligne avec des ""
	echo "%%a" | findstr %s% > NUL
0
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  
 
j'ai une fenêtre qui s'ouvre mais qui ne donne aucun résultat...
Est-ce qu'il ne serait pas mieux de renvoyer le résultat dans un fichier ?
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
changer dans le script
@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
)
0
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  
 
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...
0
Ka-El Messages postés 260 Date d'inscription   Statut Membre Dernière intervention  
 
Oui en effet, les deux caractères apparaissent.
Ils peuvent se présenter séparé ("<" ou ">") ou même ensemble ("<>")
0
Utilisateur anonyme
 
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
((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

0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
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
grep
qui 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
0
Utilisateur anonyme > zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bonjour, c'est une option.

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.
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431 > Utilisateur anonyme
 
Re- (sans option)
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é (
grep
en l'occurrence).
0
Utilisateur anonyme > zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention  
 
Ha oui, j'avais mal lu!
0
Utilisateur anonyme > Utilisateur anonyme
 
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
little boy62 Messages postés 3606 Date d'inscription   Statut Membre Dernière intervention   1 781
 
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 ;)


@++
0
little boy62 Messages postés 3606 Date d'inscription   Statut Membre Dernière intervention   1 781
 
Salut.

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.


@++
0
Ka-El
 
Bonjour Little boy62,
Justement en batch, ça n'a pas l'air simple...
En tout cas, pour l'instant je n'ai pas la solution. Mais je compte sur Dubcek ;-)
@+
0
little boy62 Messages postés 3606 Date d'inscription   Statut Membre Dernière intervention   1 781 > Ka-El
 
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.

#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.


++
0
Ka-El > little boy62 Messages postés 3606 Date d'inscription   Statut Membre Dernière intervention  
 
Malheureusement pour moi, je ne peux pas installer ce programme sur mon système...

Je n'ai pas le choix, il faut que je trouve une solution en batch :-(
0
little boy62 Messages postés 3606 Date d'inscription   Statut Membre Dernière intervention   1 781
 
Reste aussi la solution proposée par zipe31 et autres confrères ;)

bash ubuntu sous windows 10 et la commande grep.

++
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
exécuter ce script dans une fenêtre cmd, pas par double clique
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
)
0
Ka-El
 
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

(...)
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
il faut exécuter le script, pas chaque ligne, c'est illisible
0
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
0