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

Ka-El Messages postés 279 Statut Membre -  
dubcek Messages postés 18627 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

7 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    1. Ka-El Messages postés 279 Statut Membre
       
      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
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    1. Ka-El Messages postés 279 Statut Membre
       
      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
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      ya-t-il des < > dans le fichier ? c'est le probleme
      essayer en changeant la ligne avec des ""
      	echo "%%a" | findstr %s% > NUL
      0
    3. Ka-El Messages postés 279 Statut Membre > dubcek Messages postés 18627 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
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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
    5. Ka-El Messages postés 279 Statut Membre > dubcek Messages postés 18627 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
  3. Ka-El Messages postés 279 Statut Membre
     
    Oui en effet, les deux caractères apparaissent.
    Ils peuvent se présenter séparé ("<" ou ">") ou même ensemble ("<>")
    0
  4. 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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502
       
      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
      1. Utilisateur anonyme > zipe31 Messages postés 34620 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
      2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 502 > 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
      3. Utilisateur anonyme > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
         
        Ha oui, j'avais mal lu!
        0
      4. 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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. little boy62 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   1 790
     
    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
  7. little boy62 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   1 790
     
    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
    1. 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
      1. little boy62 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   1 790 > 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
      2. Ka-El > little boy62 Messages postés 4 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
    2. little boy62 Messages postés 4 Date d'inscription   Statut Membre Dernière intervention   1 790
       
      Reste aussi la solution proposée par zipe31 et autres confrères ;)

      bash ubuntu sous windows 10 et la commande grep.

      ++
      0
  8. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    1. 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
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      il faut exécuter le script, pas chaque ligne, c'est illisible
      0
    3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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