Extraire deux lignes d'un fichier à partir d'une seule info

Fermé
Ka-El Messages postés 260 Date d'inscription lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020 - 9 août 2016 à 16:24
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 18 août 2016 à 16:14
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 août 2016 à 08:57
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
10 août 2016 à 10:25
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
10 août 2016 à 10:37
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
10 août 2016 à 10:42
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 10/08/2016 à 10:56
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020 > dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024
10 août 2016 à 16:07
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 10/08/2016 à 16:20
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020 > dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024
10 août 2016 à 16:51
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 lundi 28 novembre 2011 Statut Membre Dernière intervention 7 août 2020
10 août 2016 à 10:57
Oui en effet, les deux caractères apparaissent.
Ils peuvent se présenter séparé ("<" ou ">") ou même ensemble ("<>")
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
11 août 2016 à 09:56
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
14 août 2016 à 11:38
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
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
16 août 2016 à 12:15
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
16 août 2016 à 12:21
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
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931 > zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
Modifié par Whismeril le 16/08/2016 à 21:53
Ha oui, j'avais mal lu!
0
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931 > Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024
16 août 2016 à 21:53
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 3584 Date d'inscription lundi 11 novembre 2013 Statut Membre Dernière intervention 15 avril 2024 1 757
14 août 2016 à 11:10
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 3584 Date d'inscription lundi 11 novembre 2013 Statut Membre Dernière intervention 15 avril 2024 1 757
Modifié par little boy62 le 16/08/2016 à 14:22
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
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 3584 Date d'inscription lundi 11 novembre 2013 Statut Membre Dernière intervention 15 avril 2024 1 757 > Ka-El
17 août 2016 à 14:53
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 3584 Date d'inscription lundi 11 novembre 2013 Statut Membre Dernière intervention 15 avril 2024
17 août 2016 à 16:10
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 3584 Date d'inscription lundi 11 novembre 2013 Statut Membre Dernière intervention 15 avril 2024 1 757
17 août 2016 à 19:15
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
18 août 2016 à 09:27
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
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
18 août 2016 à 12:03
il faut exécuter le script, pas chaque ligne, c'est illisible
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
18 août 2016 à 16:14
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